Prévia do material em texto
COMPUTATIONAL THINKING Roberto E. B. Leminski 1ª Edição, 2022 EAD Editora Universitária Adventista Presidente da Divisão Sul-Americana: Stanley Arco Diretor do Departamento de Educação para a Divisão Sul-Americana: Antônio Marcos da Silva Alves Presidente do Instituto Adventista de Ensino (IAE), mantenedora do Unasp: Maurício Lima Secretário do Instituto Adventista de Ensino (IAE), mantenedora do Unasp: Emmanuel Oliveira Guimaraes Tesoureiro/CFO do Instituto Adventista de Ensino (IAE), mantenedora do Unasp: Gilnei Abreu Reitor: Martin Kuhn Vice-reitor administrativo: Claudio Knoener Vice-reitor para educação superior e diretor do campus São Paulo: Afonso Ligório Cardoso Vice-reitor e diretor do campus Engenheiro Coelho: Carlos Alberto Ferri Vice-reitor para a educação básica e diretor do campus Hortolândia: Henrique Karru Romaneli Pró-Reitor Financeiro: Paulo Ricardo Monarin Pró-reitor de graduação: Edilei Rodrigues de Lames Pró-reitor de pesquisa e desenvolvimento institucional: Allan Macedo de Novaes Pró-reitor de gestão integrada: Mauricio Guimarães Lima Pró-reitor de pós-graduação lato sensu: Luis Henrique dos Santos Pró-reitor de desenvolvimento espiritual: Wendel Thomaz Lima Pró-reitor de educação a distância: Jonas Rafael Nikolay Conselho editorial e artístico: Dr. Martin Kuhn; Me. Henrique Romanelli; Dr. Afonso Cardoso; Dr. Carlos Ferri; Me. Telson Vargas; Dr. Allan Novaes; Dr. Edilei Lames; Me. Wendel Lima; Dr. Evandro Fávero; Dr. Vanderlei Dorneles; Dr. Adriani Mili; Dr. Fabio Alfieri; Dra. Silvia Quadros; Esp. Regiane Cardoso de Oliveira; Me. Lucas Alves; Dr. Adolfo Suárez; Me. Edilson Valiante; Me. Diogo Cavalcanti Editor-chefe: Allan Macedo de Novaes Engenheira de Produção: Rhayane Storch Responsável editorial pelo EAD: Regiane Cardoso de Oliveira 1ª Edição, 2022 COMPUTATIONAL THINKING Editora Universitária Adventista Engenheiro Coelho, SP Roberto E. Bruzetti Leminskii Mestrado em Engenharia Elétrica, ênfase Microeletrônica pela EPUSP Campagnoni, Mariana / dos Santos, Diego Henrique Moreira Formação da identidade profissional do contador [livro eletrônico] / Mariana Campagnoni. -- 1. ed. -- Engenheiro Coelho, SP : Unaspress, 2020. 1 Mb ; PDF ISBN 978-85-8463-172-8 1. Carreira profissional 2. Contabilidade 3. Contabilidade como profissão 4. Contabilidade como profissão - Leis e legislação 5. Formação profissional 6. Negócios I. Título. 20-33026 CDD-370.113 Dados Internacionais da Catalogação na Publicação (CIP) (Ficha catalográfica elaborada por Hermenérico Siqueira de Morais Netto – CRB 7370) Computational thinking 1ª edição – 2022 e-book (pdf) OP 00123_185 Coordenação editorial: Lorena Lima Freire Preparação:Lorena Lima Freire Projeto gráfico: Ana Paula Pirani Capa: Jonathas Sant’Ana Diagramação: Kenny Zukowski Caixa Postal 88 – Reitoria Unasp Engenheiro Coelho, SP – CEP 13448-900 Tel.: (19) 3858-5171 / 3858-5172 www.unaspress.com.br Editora Universitária Adventista Validação editorial científica ad hoc: Sandra Souza Rodrigues Mestrado em Ciências da Computação pelo ICMC/USP Editora associada: Todos os direitos reservados à Unaspress - Editora Universitária Adventista. Proibida a reprodução por quaisquer meios, sem prévia autorização escrita da editora, salvo em breves citações, com indicação da fonte. SUMÁRIO LÓGICA E PENSAMENTO COMPUTACIONAL ........... 13 Introdução ........................................................................................14 Introdução à computação e à programação ...................................16 Bits e Bytes ..............................................................................16 Sistema binário de numeração ...............................................18 Paradigmas de programação ...........................................................22 Linguagens de baixo e alto nível ............................................24 Paradigmas de linguagens de programação ..........................25 Estrutura sequencial ........................................................................33 Algoritmos ..............................................................................33 Implementação de um algoritmo ..........................................36 Tipos de dados e variáveis ...............................................................38 Tipos de dados primitivos .......................................................40 Tipos de dados compostos .....................................................45 Tipagem de uma linguagem de programação ......................48 Entrada e saída de dados ................................................................49 Pseudocódigo ..........................................................................50 Atribuição de dados ................................................................52 Instruções de entrada e saída de dados .................................53 Exemplo de algoritmo ............................................................56 Considerações finais.........................................................................60 Referências .......................................................................................61 ALGORITMOS E LÓGICA DE PROGRAMAÇÃO ......... 65 Introdução ........................................................................................66 Definição de algoritmos e operadores ............................................67 Algoritmos e dados .................................................................67 Variáveis ..................................................................................69 Operadores ..............................................................................70 Formas de representação de um algoritmo ....................................75 Pseudocódigo ..........................................................................76 VO CÊ ES TÁ A QU I Fluxograma .............................................................................78 Exemplo da representação de um algoritmo .........................80 Ferramentas para a construção de algoritmos ................................83 VisuAlg ....................................................................................84 Portugol WebStudio ................................................................85 Lucidchart ...............................................................................86 Pacote Office............................................................................87 Fundamentos de lógica proposicional ............................................87 Um pouco de história ..............................................................88 Proposição ..............................................................................88 Tabela verdade ........................................................................91 Operadores lógicos ..................................................................93 Precedência dos operadores lógicos .......................................98 Equivalência de expressões lógicas .......................................100 Implicação lógica e argumentos ............................................106 VO CÊ ES TÁ A QU I Operadores lógicos e relacionais ....................................................113 Operadores lógicos em condições .........................................115 Operadores Lógicos com mais de duas condições ................117 Precedência entre diferentes operadores ..............................118 Uso de condições em estruturas de seleção ..........................120 Considerações finais........................................................................121 Referências ......................................................................................123 ESTRUTURAS CONDICIONAIS E DE REPETIÇÃO ....................................................125 Introdução .......................................................................................126 Estrutura condicional simples ........................................................127 Condições ...............................................................................129 Estrutura se-então .................................................................131 Estrutura se-então-senão ......................................................134 Estruturas condicionais compostas ................................................138 Resumo de operadores lógicos ..............................................139 Condições compostas ............................................................141 VO CÊ ES TÁ A QU I Estruturas condicionais encadeadas...............................................145 Aplicação de condicionais encadeados .................................145 Alguns exemplos de aplicação ..............................................146 Estrutura condicional por seleção ..................................................158 Estruturas de seleção em pseudocódigo ..............................159 Exemplo de uso ......................................................................161 Estrutura condicional com repetição ..............................................163 Estrutura enquanto .........................................................................165 Exemplos de aplicação da estrutura enquanto .....................166 Considerações finais........................................................................176 Referências ......................................................................................178 ESTRUTURAS DE REPETIÇÃO, FUNÇÕES E VETORES............................................. 181 Introdução .......................................................................................182 Estrutura de repetição simples .......................................................184 Contadores .............................................................................184 Estrutura de repetição incondicional .....................................188 Acumuladores ........................................................................191 Estruturas de repetição encadeadas ......................................194 Teste de condição no início e no término da iteração ....................196 Estrutura Enquanto com contador .........................................197 Estrutura Repita......................................................................199 Funções e procedimentos ...............................................................202 Funções ..................................................................................205 Procedimentos .......................................................................207 Vetores ....................................................................................209 Aplicação e manipulação de vetores .....................................211 Matrizes ..................................................................................214 Funções para uso com matrizes .....................................................215 Preenchimento da matriz ......................................................216 Exibição da matriz ..................................................................217 Busca na matriz ......................................................................218 Algoritmo Bubble Sort ..........................................................219 Algoritmo com o uso das funções e procedimentos .............223 Considerações finais........................................................................225 Referências ......................................................................................227 EMENTA Lógica de programação e pensamento computacional; princípios de construção de algoritmos e procedimentos; expressões lógicas e estruturas de decisão; estruturas de repetição. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO UNIDADE 2 66 COMPUTATIONAL THINKING INTRODUÇÃO O desenvolvimento de algoritmos e sua implementação computacional é um dos aspectos mais importantes do pensamento computacional. Neste livro iremos aprofundar o conceito de algoritmo, mostrando suas formas de representação e ferramentas para escrevermos e testarmos algoritmos sem a necessidade do conhecimento de qualquer linguagem de programação. Além disso, iremos apresentar a lógica matemática, com ênfase no subcampo da lógica proposicional. Essa lógica é de enorme importância na área da ciência da computação, principalmente na programação estruturada, sendo, por esse motivo, um dos assuntos principais deste livro. Todo o conceito de estruturas de seleção e, em menor grau, de repetição está vinculado ao uso de expressões lógicas e seus operadores. Operadores em geral para uso em algoritmos também é um tema que iremos aprofundar aqui, com suas respectivas precedências e interações. Isso servirá de prelúdio para um estudo futuro de conceitos mais elaborados de programação. O objetivo desta unidade é o seguinte:Analisar problemas computacionais e aplicar conceitos da lógica matemática e da programação estruturada para a resolução deles. 67 ALgORITMOS E LógICA DE PROgRAMAçãO DEFINIÇÃO DE ALGORITMOS E OPERADORES Neste tópico vamos revisitar rapidamente os conceitos de algoritmo, dado e variável para introduzir o conceito de operadores, que são um importante recurso empregado no desenvolvimento de algoritmos computacionais. ALGORITMOS E DADOS Relembremos que um algoritmo, no sentido computacional, é um conjunto finito e ordenado de instruções para resolver um problema ou executar uma tarefa. O primeiro algoritmo (fora da matemática), segundo a definição anterior, é atribuído a Ada Lovelace em, 1842, que criou um conjunto de instruções para a operação da máquina analítica de Charles Babbage (Manzano, 2019, p. 33). Assim, um algoritmo precisa seguir uma sequência ordenada de cada uma das suas etapas para que a tarefa que ele deva executar seja realizada corretamente. Dasgupta (2011, p. 2) apresenta em seu prólogo a origem da palavra “algoritmo”: O meio mais influente de transmissão acabou sendo um livro- texto, escrito em árabe no século IX por um homem que vivia em Bagdá. Al Khwarizmi estabeleceu os métodos básicos para 68 COMPUTATIONAL THINKING adicionar, multiplicar e dividir números — até mesmo extrair a raiz quadrada e calcular os dígitos de π. Esses procedimentos eram precisos, não ambíguos, mecânicos, eficientes, corretos — em suma, eram algoritmos, um termo cunhado para homenagear o sábio homem, depois que o sistema decimal foi finalmente adotado na Europa, após muitos séculos. Um algoritmo na ciência da computação envolve o conceito de receber, processar e retornar dados. Um dado é a menor unidade de informação que contém um significado, não podendo ser dividido. Por exemplo, o nome de uma pessoa é um dado, pois embora possa ser dividido em nome e sobrenome, essa divisão irá retirar o significado e a capacidade do dado de identificar a pessoa que tem o nome em questão. A tabela na figura 1 apresenta os tipos de dados com os quais iremos trabalhar: Figura 1 – Principais tipos de dados DADO DESCRIÇÃO Inteiro Utilizado para representar um valor numérico inteiro, positivo ou negativo. Real Utilizado para representar um valor numérico real (com parte fracionária, se aplicável), positivo ou negativo. Pode também representar números inteiros. Lógico Utilizado para armazenar um valor lógico (verdadeiro ou falso). Caractere ou texto Utilizado para armazenar um único caractere ou um texto (string). Fonte: elaborada pelo autor. 69 ALgORITMOS E LógICA DE PROgRAMAçãO VARIÁVEIS Conforme bem resume Mokarzel (2008, p. 88), variáveis são espaços de memória reservados durante a execução de um programa de computador, ou algoritmo computacional para armazenar dados: cada variável armazena um dado apenas.Ao se criar uma variável, é necessário atribuir um nome a ela. Esse nome será utilizado ao longo do meu algoritmo ou programa para referenciar o dado que está armazenado, bem como para atribuir um dado à memória do computador. Não podemos ter mais de uma variável com o mesmo nome em um mesmo algoritmo. O uso de subprogramas e funções pode ser uma exceção a essa regra, mas os nomes eventualmente repetidos estarão em partes diferentes do meu algoritmo. Uma sugestão útil é utilizarmos os nomes das variáveis a nosso favor, batizando-as com algo que remeta ao dado que será armazenado nela, por exemplo, uma variável para armazenar o nome de uma pessoa pode se chamar “nome”, ou “pessoa”, ou algo nessa linha. Cada linguagem de programação possui suas regras próprias para definição de nomes para variáveis, mas usualmente são permitidos letras, números e alguns outros poucos caracteres, tais como sublinha, arroba ou cerquilha. 70 COMPUTATIONAL THINKING Na maioria das linguagens de programação, ao criarmos uma variável, é necessário especificarmos o tipo de dado que será armazenado nela. Nas linguagens de tipagem forte, esse tipo não poderá ser alterado ao longo do algoritmo ou programa; nas linguagens de tipagem fraca, o tipo da variável será definido por ser conteúdo, podendo ser alterado ao longo da execução do programa. O processo de declaração (criação) de uma variável será detalhado no tópico seguinte deste livro. Além das variáveis, algumas linguagens de programação também oferecem constantes. Para efeitos práticos, constantes são como variáveis em termos de declaração e uso durante o programa, com a diferença de não poderem ter seus valores alterados após a atribuição deles. Para manipular variáveis, constantes e valores, as linguagens de programação se utilizam dos operadores, que serão descritos a seguir. OPERADORES Um operador é um elemento de linguagem de programação que executa alguma operação sobre uma variável ou dado. Essa operação pode ou não alterar um dado ou o valor 71 ALgORITMOS E LógICA DE PROgRAMAçãO armazenado em uma variável. Existem quatro tipos básicos de operadores (MANZANO, 2019, p. 53-7): • atribuição; • aritméticos; • relacionais e; • lógicos. Iremos detalhar os dois primeiros tipos agora. OPERADOR DE ATRIBUIÇÃO O operador de atribuição, normalmente indicado pelo símbolo = (igual) ou pelo símbolo ← (seta para a esquerda), tem como função atribuir um valor a uma variável ou constante. Por exemplo, variável1 = 10 significa que a variável indicada recebe o valor numérico 10. Como reforça Torres (2019, p. 72), sempre será uma variável recebendo um valor do tipo adequado. Apesar de usarmos o sinal de igual, é importante observar que não se trata de uma comparação ou uma equação. Esse símbolo não possui o mesmo significado de quando é empregado na matemática. Neste livro, iremos utilizar a seta (←)como operador 72 COMPUTATIONAL THINKING de atribuição, e o sinal de igual (=) será um operador relacional, que será apresentado em um tópico mais adiante. OPERADORES ARITMÉTICOS Os operadores aritméticos realizam as operações aritméticas básicas, da forma como as conhecemos. Porém, como em um algoritmo para aplicações computacionais temos que especificar cada detalhe para que o computador possa executar, alguns cuidados se fazem necessários quanto à divisão. A figura 2 apresenta os operadores relacionais com suas notações mais utilizadas: Figura 2- Operadores aritméticos OPERADOR DESCRIÇÃO + - Soma entre dois valores numéricos; - operador unário de positivo. - - Subtração entre dois operadores numéricos; - operador unário de negativo. * Multiplicação entre dois valores numéricos. ^ Potenciação (eleva um número a outro). / Divisão real entre dois valores numéricos \ ou // Divisão inteira entre dois valores numéricos inteiros. % ou MOD Resto da divisão inteira entre dois valores numéricos inteiros. Fonte: elaborada pelo autor. 73 ALgORITMOS E LógICA DE PROgRAMAçãO Os dois últimos operadores usualmente só podem ser utilizados entre valores inteiros embora algumas linguagens de programação possuam apenas um operador para divisão e o resultado da divisão seja definido tendo como base os tipos de dados envolvidos na operação. Para ilustrarmos a diferença entre eles, vamos supor a divisão de 73 por 5: • 73 / 5 resulta em 14,6; • 73 / 5 resulta em 14 (apenas a parte inteira da divisão); • 73 MOD 5 resulta em 3 (resto da divisão inteira). Como na aritmética usual, temos aqui também uma precedência dos operadores (SEBESTA, 2011, p. 302). Assim, a ordem que os operadores aritméticos serão executados em uma expressão matemática será: PRECEDÊNCIA Característica daquilo que vem antes, que tem prioridade sobre os demais em um grupo. 74 COMPUTATIONAL THINKING 1. operações entre parênteses; 2. potenciação; 3. positivo/negativo; 4. multiplicação, divisão e resto da divisão, na ordem em que aparecerem (da esquerda para a direita); 5. soma e subtração na ordem que aparecerem (da esquerda para a direita). Vamos dar um exemplo: suponhamos três variáveis numéricas A, B e C. A variável A recebe o valor 12, a variável B recebe o valor 20 e a variável C será obtida pela fórmula . Como temos uma fração, tanto o denominador quanto o numerador precisam estar entre parênteses, pois a divisão (fração) será a última etapa a ser resolvida. Em algoritmos, utilizamos parênteses dentro de parênteses, diferentemente da matemática (chaves e colchetes têm outras aplicações na maioria das linguagens de programação), mas temos sempre que lembrar de fechá-los nas posições certas. Assim, esse trecho de algoritmo ficará: 75 ALgORITMOS E LógICA DE PROgRAMAçãO A <- 12 B <- 20 C <- (A * (A + 2*B) ^3) / (3* A + 5*B) Assumimos aqui que as três variáveis foram previamente declaradas. Esse processo de escrevermos uma expressão matemática em um formato de apenas uma linha é chamado de linearização. FORMAS DE REPRESENTAÇÃO DE UM ALGORITMO Um algoritmo precisa ser representado de uma forma que possa ser entendido por quem o lê, além de que favoreça sua conversão para uma linguagem de programação. A descrição na forma de texto linear em um idioma tem como dificuldade a falta de clareza provocada, paradoxalmente, pela riqueza dos idiomas: sinônimos, homônimos e outros recursos dos idiomas podem gerar dúvidas e ambiguidades na compreensão do algoritmo. A representação de um algoritmo tem que representar adequadamente o fluxo de execução das instruções da estrutura sequencial contida em um algoritmo. 76 COMPUTATIONAL THINKING Assim, formas mais objetivas de representar um algoritmo se fazem necessárias. Vamos apresentar duas formas de representar um algoritmo: • pseudocódigo e; • fluxograma. PSEUDOCÓDIGO Como já sabemos, o pseudocódigo (ou português estruturado) é uma maneira de representar um algoritmo em uma forma que se baseia em versão restrita do idioma, que faz uso de poucas palavras, as quais têm um uso muito específico. O formato básico de um algoritmo nessa representação é o seguinte: algoritmo “NOME DO ALGORITMO” var DECLARAÇÃO DAS VARIÁVEIS início ENTRADA, PROCESSAMENTO E SAÍDA (CORPO DO ALGORITMO) fim_algoritmo As principais palavras reservadas – que podem ser utilizadas e compreendidas no contexto do pseudocódigo – são: 77 ALgORITMOS E LógICA DE PROgRAMAçãO • algoritmo: indica o início do algoritmo como um todo; • var: indica o início da declaração das variáveis na minha estrutura. Após o nome de cada variável, devemos indicar o tipo dela. • início: marca o ponto onde se inicia a execução (entrada-processamento-saída) do algoritmo e o fim da declaração das variáveis. • fim_algoritmo: indica o final do algoritmo e da parte referente à execução dele. • leia (X): recebe um valor externo fornecido pelo usuário e o armazena na variável X. • escreva ( ): escreve (exibe na tela) o que estiver entre parênteses, que podeser uma combinação de textos e variáveis, separados por vírgula. Além dessas palavras reservadas, existem algumas que são específicas para determinadas estruturas. As respectivas palavras reservadas serão apresentadas quando as estruturas forem explicadas. 78 COMPUTATIONAL THINKING FLUXOGRAMA O fluxograma é uma forma gráfica de representar um algoritmo, fazendo uso de blocos de diferentes formatos que representam diferentes operações e etapas dele. A ideia por trás de um fluxograma é permitir uma visualização mais fácil do algoritmo como um todo, assim renunciamos a alguns detalhes. As duas principais diferenças entre um fluxograma e o pseudocódigo são: • No fluxograma usualmente não é apresentada a declaração das variáveis. Essas surgirão quando forem utilizadas. Isso torna mais difícil compreender o tipo de uma variável, bem como a eventual variação de seus valores ao longo da execução; • Saídas de textos não relevantes são omitidas como, por exemplo, aquelas que precedem a leitura de dados ou que acompanham a saída de resultados. Obviamente, saídas de texto que têm relevância para o algoritmo, tais como mensagens para o usuário acerca do processamento ou de resultados, são mantidas. 79 ALgORITMOS E LógICA DE PROgRAMAçãO A figura 3 apresenta os elementos fundamentais para a construção de um fluxograma, segundo a norma ISO 5807:1985 (E), conforme apresentado por Manzano (2019, p. 35-36): Figura 3- Principais elementos de um fluxograma ELEMENTO DESCRIÇÃO Representa o fluxo da estrutura sequencial. Indica o início e o término do fluxograma (algoritmos com ramificações podem ter mais de um bloco desses para indicar diferentes términos). Processamento (atribuição de valores, operações aritméticas). Entrada de dados (genérica). Saída de dados (genérica). Fonte: adaptada de Manzano (2019, p. 36). 80 COMPUTATIONAL THINKING Dentro de cada bloco colocamos a operação correspondente. Existem outros blocos para representar outros tipos de estruturas que utilizamos, mas esses serão apresentados quando a respectiva estrutura for apresentada. EXEMPLO DA REPRESENTAÇÃO DE UM ALGORITMO Vamos mostrar um exemplo das duas formas apresentadas de se representar um algoritmo. Consideremos o seguinte problema: “fazer um algoritmo que receba duas notas de um estudante, com seus respectivos pesos, e calcule e apresente como saída a média ponderada dessas notas”. Primeiro, algumas considerações: • Variáveis e tipos de dados: temos quatro valores numéricos como entradas e um valor que será calculado. Assim, precisaremos de cinco variáveis numéricas. Por se tratar de notas e médias, usaremos o tipo real para todas. • Entradas e saídas: como visto, serão quatro entradas (instrução leia no pseudocódigo e o bloco correspondente no fluxograma) e uma saída (instrução escreva no pseudocódigo); 81 ALgORITMOS E LógICA DE PROgRAMAçãO • Processamento: o processamento será o cálculo da média. Lembremos de linearizar a equação como visto anteriormente. Assim, nosso algoritmo ficará, em pseudocódigo, como demonstrado abaixo e em fluxograma, como mostrado na figura 4. algoritmo “MEDIA PONDERADA” var nota1, peso1, nota2, peso2, media: real; início escreva (“Entre com a Nota 1: “) leia (nota1) escreva (“Entre com a Nota 2: “) leia (nota2) escreva (“Entre com o Peso 1: “) leia (peso1) escreva (“Entre com o peso 2: “) leia (peso2) media <- (nota1 * peso1 + nota2 *peso2) / (peso1 + peso2) escreva (“A média ponderada é: “, media) fim_algoritmo 82 COMPUTATIONAL THINKING Figura 4- Fluxograma do algoritmo de exemplo Início nota 1, nota 2, nota 3, nota 4 media <- (nota 1 * paso 1 + nota 2 * peso 2) / (peso 1 + peso 2) Média Fim Fonte: elaborada pelo autor. Podemos observar que as diversas saídas de texto (as instruções escreva do pseudocódigo) foram omitidas no fluxograma. Porém, podemos enxergar a estrutura do algoritmo no fluxograma sem a necessidade de lermos cada linha, apenas pela observação dos blocos presentes e de como eles se conectam. 83 ALgORITMOS E LógICA DE PROgRAMAçãO FERRAMENTAS PARA A CONSTRUÇÃO DE ALGORITMOS Nas décadas anteriores, a representação de algoritmos, seja em pseudocódigo ou em fluxograma, era realizada no papel. Existiam inclusive gabaritos com os blocos para se desenhar os fluxogramas. Atualmente existem diversos recursos computacionais que permitem uma representação mais fácil e visualmente mais elegante e limpa de algoritmos. Neste tópico vamos apresentar algumas dessas ferramentas. A escolha dos recursos aqui apresentados reflete as experiências e preferências do autor, que não recebeu nenhum patrocínio ou bônus pela indicação das ferramentas a seguir. Os links e páginas apresentados se referem à disponibilidade no momento da elaboração deste livro, podendo Um fluxograma sacrifica detalhes na representação do algoritmo para permitir uma visão mais clara do conjunto. 84 COMPUTATIONAL THINKING estar sujeitos a alterações ou mesmo vir a se tornarem indisponíveis no futuro. No entanto, sempre haverá uma grande disponibilidade de diferentes ferramentas gratuitas para a construção e simulação de algoritmos. VISUALG O VisuAlg é uma ferramenta gratuita para a elaboração de pseudocódigo em português, que pode ser instalada em qualquer computador com sistema operacional Windows. O programa apresenta uma interface muito semelhante a uma IDE (Integrated Development Environment, ou ambiente de programação integrado), um programa de computador que possui um conjunto de ferramentas e recursos para a criação de programas de computador em uma linguagem de programação mais antiga, e possui um compilador embutido (ferramenta que verifica a correção da sintaxe do pseudocódigo). O VisuAlg é uma ferramenta didática e apresenta várias restrições em relação ao uso de estruturas de dados mais elaboradas, porém é extremamente útil para a elaboração e testes de algoritmos estruturados. A figura 5 apresenta a interface típica do VisuAlg: 85 ALgORITMOS E LógICA DE PROgRAMAçãO Figura 5 - Interface do VisuAlg Fonte: elaborada pelo autor. PORTUGOL WEBSTUDIO O Portugol WebStudio é uma ferramenta online gratuita para escrever em pseudocódigo. Assim, podemos utilizar apenas um navegador web para escrever e executar nosso algoritmo. Diferente do VisuAlg, que inclui um passo a passo dos estados das variáveis, aqui, a janela do navegador é dividida apenas entre o pseudocódigo escrito e a saída do algoritmo sendo executado. Uma desvantagem dessa ferramenta é que ela utiliza uma variante do pseudocódigo que remete muito à sintaxe da 86 COMPUTATIONAL THINKING linguagem C (FEOFILOFF, 2009, p. 130), o que pode causar certa dificuldade em um primeiro contato. Porém, os exemplos disponíveis que podem ser acessados rapidamente esclarecem as características do pseudocódigo utilizado pela ferramenta. Você pode acessar em: https://portugol-webstudio.cubos.io/. Acesso em: 05 maio 2022. LUCIDCHART Lucidchart é uma ferramenta online para a criação de fluxogramas. Exige um cadastro e possui uma versão gratuita e versões pagas; a diferença está no tamanho dos fluxogramas que podem ser elaborados e no espaço de armazenamento disponível no site para os fluxogramas elaborados. Essa ferramenta não possibilita a execução do fluxograma, apenas sua elaboração. A interface do tipo “selecione-e-arraste” é extremamente intuitiva e fácil de ser utilizada. Fluxogramas desenhados nela podem ser exportados em diferentes formatos, tais como .pdf e .jpg. Você pode acessar em: https://www. lucidchart.com/. Acesso em: 05 maio 2022. https://portugol-webstudio.cubos.io/ https://www.lucidchart.com/ https://www.lucidchart.com/ 87 ALgORITMOS E LógICA DE PROgRAMAçãO PACOTE OFFICE O pacote Office, mais especificamente o Microsoft Word e o Microsoft PowerPoint, permitem desenhar fluxogramas e integrá- los em documentos e apresentações. O formato das páginas tornaum pouco difícil elaborar estruturas muito grandes, mas o formato “selecione-e-arraste” torna o desenho bastante simples. Para desenhar, selecione o menu Inserir > Formas, em que haverá uma caixa com os blocos característicos dos fluxogramas. As versões mais recentes apresentam grades durante o posicionamento dos blocos, o que gera um bom alinhamento dos blocos e um conjunto visualmente agradável. FUNDAMENTOS DE LÓGICA PROPOSICIONAL A lógica matemática desempenha um importante papel na ciência da computação. Além de termos um próprio paradigma de programação, que é a programação lógica (baseado na lógica de predicados, e que tem como principais linguagens o Prolog e o Planner), temos o uso de expressões lógicas como elemento fundamental das estruturas de seleção na programação estruturada. Vamos compreender os fundamentos da lógica 88 COMPUTATIONAL THINKING proposicional, que é um dos ramos da lógica matemática e sua aplicação no pensamento computacional. UM POUCO DE HISTÓRIA Como descreve Bispo (2013) em sua introdução, as origens da lógica remontam à Grécia Antiga, mais especificamente a Aristóteles (384 a.C. – 322 a.C.), que criou os conceitos de termo e proposição. Esta Lógica, chamada de lógica clássica, era um ramo da filosofia e da retórica e permaneceu quase sem alterações até o século 19. A conexão da lógica clássica com a matemática foi estabelecida por George Boole (1815 – 1864) e Augustus De Morgan (1806 -1871). Um fundamento da lógica clássica que permaneceu inalterado na nova lógica, tanto da aristotélica quanto da lógica matemática (que também é chamada de lógica boolena ou álgebra de Boole, por causa de seu autor) foi o conceito de proposição. PROPOSIÇÃO Da Silva (2008, p. 3) define incialmente proposição “um enunciado ao qual podemos atribuir um valor verdade 89 ALgORITMOS E LógICA DE PROgRAMAçãO (verdadeiro ou falso).” Porém, uma proposição não pode ser qualquer enunciado que atenda apenas esse requisito. Uma proposição não pode ser autorreferenciar, por exemplo: “Esta proposição não é falsa” não é uma proposição, na verdade. Afirmações indefinidas ou incompletas (sem sujeito ou definição de tempo ou espaço, como por exemplo “choveu lá”), especulações, ordens e perguntas também não são proposições. Além disso, uma proposição deve atender também a dois princípios: • Princípio do terceiro excluído: uma proposição só pode ser verdadeira ou falsa, não havendo uma terceira alternativa possível. • Princípio da não contradição: uma proposição não pode ser ao mesmo tempo verdadeira e falsa. Proposição é um enunciado declarativo ao qual podemos atribuir um valor lógico verdadeiro ou falso. 90 COMPUTATIONAL THINKING Isso ficará mais claro com alguns exemplos. São proposições: • A lua é uma estrela. (valor lógico falso) • 23 = 6. (valor lógico falso) • O ano 2000 foi bissexto. (valor lógico verdadeiro) • O estado de Goiás fica na região Centro- Oeste do Brasil. (valor lógico verdadeiro) Pelos mesmos princípios, não são proposições: • Dois mais três mais quatro. (incompleto) • Estude para a prova! (imperativo) • Lá faz calor. (indefinido) • Acho que vou ganhar o sorteio. (especulação) • Você está bem? (pergunta) 91 ALgORITMOS E LógICA DE PROgRAMAçãO IMPORTANTE A forma mais simples de definir se alguma frase ou afirmação é uma propo- sição é nos perguntar: “podemos atribuir um valor lógico a essa expressão?”. Algumas proposições podem mudar de valor lógico em determinados momentos, mas nunca violarão os princípios citados. Por exemplo, o valor lógico da proposição “João está em casa neste momento” pode ser verdadeiro ou falso em diferentes momentos, mas nunca poderá ser ambos ao mesmo tempo ou admitir uma terceira possibilidade, ou ele está, ou não está. Na lógica matemática, usualmente utilizamos uma letra para indicar uma proposição e não precisarmos escrevê-la por extenso durante o desenvolvimento e operações com uma expressão lógica. Esse ramo da lógica matemática, envolvendo apenas proposições como elementos básicos e as operações que podemos realizar sobre elas é denominado lógica proposicional. Considerando que uma proposição possui duas possibilidades de valores lógicos, quando agrupamos duas ou mais proposições passamos a ter um conjunto maior de combinações. Para organizarmos essas combinações, utilizamos a tabela verdade. TABELA VERDADE A tabela verdade é uma tabela em que são listadas, para um conjunto de proposições, todas suas possíveis combinações 92 COMPUTATIONAL THINKING de valores lógicos (verdadeiro ou falso). Usualmente se usam as abreviações V para verdadeiro e F para falso. Em outras aplicações, como, por exemplo, circuitos digitais, utilizam-se respectivamente, 1 e 0 para representar estes valores lógicos. Cada linha da tabela verdade representa uma diferente combinação entre as proposições. O número de linhas de uma tabela verdade será 2 elevado ao número de proposições presentes na tabela, que é o número de possíveis combinações de valores lógicos entre as proposições. A figura 6 mostra alguns exemplos de tabelas verdade, para duas e três proposições, cobrindo todas as possíveis combinações de valores lógicos entre as proposições: Figura 6 - Exemplos de tabelas verdade (P, Q e R são proposições) P Q P Q R F F F F F F V F F V V F F V F V V F V V V F F V F V V V F V V V Fonte: elaborada pelo autor 93 ALgORITMOS E LógICA DE PROgRAMAçãO Uma expressão lógica é um conjunto de proposições que possui um valor lógico único para cada combinação de entradas das proposições desse conjunto. As operações lógicas serão descritas a seguir. OPERADORES LÓGICOS Com vimos anteriormente, um operador é um elemento que atua sobre uma entidade (aqui serão as proposições), seguindo regras definidas. Na lógica matemática existem diversas operações, mas vamos apresentar apenas as mais básicas da lógica proposicional, com a definição da operação e sua respectiva tabela verdade. Ainda, na lógica matemática, existem diversas simbologias para cada operador. Desse modo, para simplificar o entendimento, utilizaremos apenas um símbolo para cada um deles ao longo de todo o livro. Também será fornecida apenas uma explicação muito direta, sem maiores detalhes, sobre o funcionamento de cada operador, por motivos de concisão. NEGAÇÃO A negação inverte o valor lógico de uma proposição ou expressão lógica: verdadeiro se torna falso e vice-versa. A simbologia é preceder a proposição ou expressão por um 94 COMPUTATIONAL THINKING til (~). A tabela verdade na figura7 ilustra o funcionamento desse operador. Figura 7 - Tabela verdade do operador da negação P ~P F V V F Fonte: elaborada pelo autor CONJUNÇÃO (E) A operação lógica da conjunção, também chamado de E, associa duas proposições ou mais entradas na forma p ∧ q (lê-se “p e q”). Essa operação somente terá valor lógico verdadeiro quando todas as proposições forem verdadeiras. A tabela verdade na figura 14 ilustra o funcionamento deste operador. DISJUNÇÃO (OU) A operação lógica da disjunção, também chamado de OU, associa duas proposições ou mais entradas na forma p ∨ q (lê-se “p ou q”). Essa operação somente terá valor lógico falso quando todas as proposições forem falsas, sendo verdadeira quando ao menos uma das proposições for verdadeira. A tabela verdade na figura 8 também ilustra o funcionamento deste operador. 95 ALgORITMOS E LógICA DE PROgRAMAçãO DISJUNÇÃO EXCLUSIVA (OU EXCLUSIVO) A operação lógica da disjunção exclusiva, também chamado de OU exclusivo, associa duas proposições ou mais entradas na forma p (+) q (lê-se “p ou exclusivo q”). Essa operação somente terá valor lógico verdadeira quando todas as proposições possuírem valores lógicos diferentes, quando apenas uma delas for verdadeira, sendo falsa quando as proposições possuírem valores lógicos iguais. A tabela verdade na figura 8 também ilustra o funcionamento desse operador. Figura8 - Tabela verdade dos operadores E, OU e OU exclusivo P Q P ∧ Q P ∨ Q P (+) Q F F F F F F V F V V V F F V V V V V V F Fonte: elaborada pelo autor. IMPLICAÇÃO (SE... ENTÃO) A operação lógica da implicação, também chamado de Se... Então, associa duas proposições ou mais entradas na forma p → q (lê-se “se p, então q”). Esse formato pode passar a falsa impressão de que a proposição q é consequência da proposição p, porém não é esse o funcionamento desse operador. O real significado é que a ocorrência da proposição q é condição 96 COMPUTATIONAL THINKING necessária para a ocorrência da proposição p. Ou seja, p não pode ocorrer (ser verdadeiro) se q não ocorrer (também ser verdadeiro). Isso é contraintuitivo, sendo diferente de como usamos a expressões “se” e “então” tanto no nosso idioma quanto em linguagens de programação. Um exemplo: na lógica matemática, a frase “se está chovendo, então assisto TV” significa “se eu estiver assistindo TV, pode estar chovendo”; assim, não pode estar chovendo se eu não estiver assistindo TV. Essa operação somente terá valor lógico falso se a primeira proposição for verdadeira e a segunda proposição for falsa, sendo verdadeira nos demais casos. É importante observar que é o único dos operadores lógicos que não é comutativo. A tabela verdade na figura 9 ilustra o funcionamento desse operador. Percebam a presença de duas colunas, com o mesmo operador e os operadores em ordem diferente para ilustrar a não-comutatividade do operador. DUPLA IMPLICAÇÃO (SE-E-SOMENTE-SE) A operação lógica da dupla implicação, também chamado de equivalência ou Se-e-seomente-se, associa duas proposições ou mais entradas na forma p ↔ q (lê-se “p se e somente se q” ou “p equivale a q”). Nesse operador, estabelece-se uma relação de condição necessária e suficiente entre as duas proposições: a ocorrência de uma delas (ser verdadeira) 97 ALgORITMOS E LógICA DE PROgRAMAçãO implica automaticamente na ocorrência da outra (também ser verdadeira). Assim, essa operação somente terá valor lógico verdadeira quando ambas as proposições possuírem valores lógicos iguais (ambas verdadeiras ou ambas falsas), sendo falsa quando as proposições possuírem valores lógicos diferentes (uma verdadeira e outra falsa). A tabela verdade na figura 9 também ilustra o funcionamento desse operador. É importante observar que esse operador é o inverso do operador Ou Exclusivo: (p (+) q) = ~( p ↔ q). Figura 15 - Tabela verdade dos operadores Se... Então e Se-e-somente-se P Q P → Q Q → P P ↔ Q F F V V V F V V F F V F F V F V V V V V Fonte: elaborada pelo autor. NA PRÁTICA Os operadores lógicos são também utilizados na eletrônica. Em circuitos lógicos digitais, temos as portas lógicas, que são componentes que executam exatamente as operações lógicas dos operadores da negação, conjunção, disjunção e disjunção exclusiva, e as negações desses três últimos. Essas sete portas lógicas, quando combinadas, possibilitam a construção de quase qualquer circuito eletrônico para executar operações lógicas. 98 COMPUTATIONAL THINKING PRECEDÊNCIA DOS OPERADORES LÓGICOS Assim como ocorre com os operadores aritméticos, também existe uma precedência para os operadores lógicos. Quando houver uma expressão lógica com diversos operadores, a ordem de resolução deles será a seguinte: 1. operações entre parênteses, se houver; 2. negação; 3. e; 4. ou e ou exclusivo, na ordem (da esquerda para a direita); 5. se... então; 6. ee-e-somente-se. Vamos dar um exemplo: considere a expressão lógica S = ~a ↔ b ∨ c. A ordem de resolução, pelas regras de precedência, será: 1. negação de a; 99 ALgORITMOS E LógICA DE PROgRAMAçãO 2. b ou c; 3. não-a se, e somente se, b ou c. A tabela verdade para essa expressão está na figura 10 a seguir: Figura 10- Tabela verdade para a expressão S = ~a ↔ b ∨ c a b c ~a b ∨ c ~a ↔ b ∨ c F F F V F F F F V V V V F V F V V V F V V V V V V F F F F V V F V F V F V V F F V F V V V F V F Fonte: elaborada pelo autor. 100 COMPUTATIONAL THINKING Ou seja, a expressão lógica S será verdadeira para apenas quatro das oito combinações possíveis das entradas a, b e c. EQUIVALÊNCIA DE EXPRESSÕES LÓGICAS Duas expressões lógicas são equivalentes se apresentam as mesmas proposições e têm como resultado o mesmo valor lógico para cada uma das possíveis combinações das proposições que as compõem. Tendo em vista que a dificuldade de resolução (construção da tabela verdade) de uma expressão lógica é proporcional ao número de operadores presentes, é interessante, sempre que possível, substituir uma expressão lógica mais complexa por uma mais simples (com menor quantidade de operadores). Qualquer expressão lógica possuirá infinitas outras expressões lógicas equivalentes. 101 ALgORITMOS E LógICA DE PROgRAMAçãO Existe um conjunto de regras denominado leis da lógica. Essas regras não são exatamente leis no sentido utilizado na física, mas sim uma lista de equivalências mais comuns entre expressões lógicas: uma expressão pode ser substituída por outra que resultará no mesmo valor lógico de saída, para quaisquer combinações de entradas. Obviamente, essas equivalências são de mão dupla, podendo uma expressão ser substituída por qualquer outra equivalente. Antes de apresentarmos as leis da lógica, precisamos definir duas terminologias referentes a expressões lógicas: • • Tautologia: uma expressão lógica é chamada de tautologia quando todas as suas saídas são verdadeiras, para quaisquer combinações possíveis de valores lógicos das proposições que a compõe. Por exemplo, p ~p é uma tautologia; • • Contradição: uma expressão lógica é chamada de contradição quando todas as suas saídas são falsas, para quaisquer combinações possíveis de valores lógicos das proposições que a compõe. Por exemplo, p ~p é uma contradição. 102 COMPUTATIONAL THINKING Vamos agora listar as leis da lógica, com seus respectivos nomes e quais equivalências elas representam. As letras p, q e r representam proposições. Aqui, é interessante fazer duas observações: algumas leis apresentam mais de uma equivalência sob o mesmo nome; e o símbolo ≡ significa “equivalência”. • Lei idempotente: p ∧ p ≡ p e p ∨ p ≡ p • Lei da absorção: (p ∨ q) ∧ p p e (p ∧ q) ∨ p ≡ p • Lei da negação: ~(~p) ≡ p • Lei da implicação: p → q ≡ ~p ∨ q • Lei da equivalência: p ↔ q ≡ (p → q) ∧ (q → p) • Lei contrapositiva: p → q ≡ ~q → ~p • Lei associativa: (p ∧ q) ∧ r ≡ p ∧ (q ∧ r) e (p ∨ q) ∨ r ≡ p ∨ (q ∨ r) • Lei de DeMorgan: ~(p ∨ q) ≡ ~p ∧ ~q e ~(p ∨ q) ≡ ~p ∨ ~q 103 ALgORITMOS E LógICA DE PROgRAMAçãO • Lei distributiva: p ∧ (q ∨ r) ≡ (p ∧ q) ∨ (p ∧ r) e p ∨ (q ∧ r) ≡ (p ∨ q) ∧ (p ∨ r) • Lei da identidade: p ∧ T ≡ p e p ∨ C ≡ p, onde T representa uma tautologia e C representa uma contradição. • Equivalência do ou exclusivo: p (+) q ≡ p ↔ q e p (+) q ≡ (~ p ∧ q) ∨ (~ q ∧ p) AGORA É COM VOCÊ Todas essas substituições podem ser demonstradas por meio da construção das respectivas tabelas verdade para cada uma delas. Não temos espaço neste livro para essa demonstração, mas sugerimos que você realize cada uma delas. Nesse processo de demonstração, é possível identificar outras equivalências entre expressões lógicas? Lembre-se que as leis listadas são apenas os casos mais comuns de equivalências, pois existem infinitas. Uma observação importante: se analisarmos a equivalência do ou exclusivo, a lei da implicação e a combinação dessa última com a lei da equivalência, podemos observar que é possível representar qualquer expressão lógica por meio de apenas três operadores. 104 COMPUTATIONAL THINKING Vamos dar um exemplo: considere a expressão lógica ~x ∨ ~(y ∨ z ∧ ~z). Analisemos passo a passo: • z ∧ ~z é uma contradição. Assim, a expressão fica ~x ∨ ~(y ∨ C). C indica uma contradição; • Aplicando a lei da identidade, o termo dentro dos parênteses é equivalente a y. Assim, a expressão fica ~x ∨ ~y;• Por fim, aplicamos a lei de DeMorgan, e a expressão se torna ~(x ∧ y). Podemos observar que a proposição z não tem efeito na saída da expressão lógica. Apenas x e q influenciam a saída da expressão (saída é a coluna que corresponde à expressão final). A figura 11 apresenta as tabelas verdade para ambas as expressões, demonstrando a equivalência. Figura 11 - Tabelas verdade para as expressões ~x ∨ ~(y ∧ z ∨ ~z) e ~(x ∧ y) x y z ~z z ∧ ~z (y ∨ z ∧ ~z) ~(y ∨ z ∧ ~z) ~x ~x ∨ ~(y ∨ z ∧ ~z) F F F V F F V V V F F V F F F V V V F V F V F V F V V 105 ALgORITMOS E LógICA DE PROgRAMAçãO x y z ~z z ∧ ~z (y ∨ z ∧ ~z) ~(y ∨ z ∧ ~z) ~x ~x ∨ ~(y ∨ z ∧ ~z) F V V F F V F V V V F F V F F V F V V F V F F F V F V V V F V F V F F F V V V F F V F F F x y z x ∧ y ~(x ∧ y) F F F F V F F V F V F V F F V F V V F V V F F F V V F V F V V V F V F V V V V F Fonte: elaborada pelo autor Por fim, nem sempre é possível obter uma expressão equivalente mais simplificada para dada expressão: expressões com dois ou três operadores muitas vezes já são a expressão mais simples para uma dada saída. Sempre que não conseguirmos visualizar qual lei da lógica empregar para simplificar, existe a possibilidade de que a expressão não possa ser simplificada. 106 COMPUTATIONAL THINKING IMPLICAÇÃO LÓGICA E ARGUMENTOS Uma estrutura argumentativa, ou simplesmente argumento, envolve um conjunto de duas ou mais expressões lógicas no qual uma delas (e apenas uma) é dependente, ou consequência das demais. O objetivo de um argumento é que essa expressão consequente (denominada conclusão) seja sustentada ou provada pelas demais expressões lógicas (denominadas premissas) na estrutura. A intenção é que as premissas forneçam uma base para se possa demonstrar ou sustentar a conclusão do argumento (Bispo, 2013, p. 32). Caso as premissas sustentem a conclusão, dizemos que a conclusão é uma implicação lógica das premissas (Lipschutz, 2013, p. 75). Uma conclusão será consequência de um conjunto das premissas se, para todos os casos em que todas as premissas forem verdadeiras, a conclusão também é. Nesse caso, dizemos que o argumento é válido; caso contrário, o argumento é inválido, o que também é chamado de falácia. Quando um argumento é apresentado na forma de texto, usualmente a conclusão está evidenciada por meio de alguma expressão que indique a ideia de consequência: portanto, consequentemente, assim sendo etc. A resolução de um 107 ALgORITMOS E LógICA DE PROgRAMAçãO argumento consiste em verificar a validade dele, de acordo com as seguintes etapas: 1. identificar as premissas e a conclusão; 2. identificar as proposições que compõem as expressões lógicas identificadas no passo anterior; 3. construir as expressões lógicas em notação formal (com o uso dos operadores lógicos); 4. montar uma tabela verdade contendo as pre- missas e a conclusão; 5. se em todas as linhas da tabela em que todas as premissas forem verdadeiras a conclu- são também for verdadeira, o argumento é válido. No caso de não haver nenhuma linha da tabela verdade para a qual todas as pre- missas sejam verdadeiras, o argumento será automaticamente falso, independetemente dos valores lógicos da conclusão. 108 COMPUTATIONAL THINKING Vamos a um exemplo. Consideremos o argumento: “Se o destinatário não estava em casa, a encomenda não foi entregue. O destinatário estava em casa. Assim sendo, a encomenda foi entregue.” Podemos observar com facilidade que temos duas premissas (“se o destinatário não estava em casa, a encomenda não foi entregue” e “O destinatário estava em casa”) e a conclusão (“a encomenda foi entregue”). A etapa seguinte é identificar as proposições. Temos duas proposições: E: a encomenda foi entregue. D: o destinatário estava em casa. Agora montemos as expressões lógicas, utilizando os operadores lógicos. O símbolo ∴ significa “consequentemente”, e é colocado antes da conclusão, para identificá-la: D → E D ∴ E Agora montamos a tabele verdade, sendo interessante, para facilitar a visualização, agrupar as premissas no final, mesmo que elas sejam uma das proposições básicas (nesse caso, 109 ALgORITMOS E LógICA DE PROgRAMAçãO simplesmente copiamos a coluna correspondente), conforme mostrado na figura 12: Figura 12 - Tabelas verdade para o argumento PREMISSAS CONCLUSÃO Linha D E D → E D E 1 F F V F F 2 F V V F V 3 V F F V F 4 V V V V V Fonte: elaborada pelo autor Buscamos na tabela verdade todas as linhas nas quais todas as premissas são verdadeiras: no caso do exemplo, apenas a linha 4. Se a conclusão for verdadeira em todas essas linhas, o argumento será válido. Assim, o argumento apresentado no exemplo é válido. SILOGISMOS Um caso particular de argumento recebe o nome de silogismo. Para que um argumento seja um silogismo, ele deve apresentar as seguintes características: • um silogismo terá sempre duas premissas; 110 COMPUTATIONAL THINKING • deve haver três proposições, cada uma delas presente duas vezes nas três expressões que compõem o argumento (uma mesma proposição não pode aparecer duas vezes na mesma expressão, seja em uma premissa ou na conclusão). Esse tipo de estrutura argumentativa remete à lógica clássica, que era um ramo da filosofia e da retórica. O conceito de silogismo era um dos fundamentos da lógica postulada por Aristóteles (384 a.C. — 322 a.C.) que, como vimos no início deste tópico, era a única forma de lógica até o século 19. Um exemplo de silogismo: “se o regulamento está incompleto, então ele será atualizado. O regulamento não pode ser atualizado sem convocar uma assembleia. Assim, uma assembleia será convocada se e somente se o regulamento estiver incompleto”. Identificamos as duas premissas (“se o regulamento está incompleto, então ele será atualizado” e “o regulamento não pode ser atualizado sem convocar uma assembleia”) e a conclusão (“uma assembleia será convocada se e somente se o regulamento estiver incompleto”). A próxima etapa é identificar as proposições. Se o argumento estiver na forma de texto, muitas vezes precisaremos adequar os tempos verbais, mas sem comprometer a ideia de cada expressão lógica: 111 ALgORITMOS E LógICA DE PROgRAMAçãO I : o regulamento está incorreto A : o regulamento é atualizado C : uma assembleia é convocada Recomenda-se, para maior flexibilidade, colocar os verbos das proposições no presente do indicativo. Assim, o argumento ficará: I → A ~A ∧ ~C ∴ C ↔ I Podemos observar que esse argumento satisfaz todas as condições para ser um silogismo. A resolução de um silogismo se dá da mesma forma que a de um outro argumento. A figura 13 mostra a tabela verdade correspondente a esse argumento: Figura 13 - Tabelas verdade para o silogismo PREMISSAS CONCLUSÃO Linha I A C I → A ~A ∧ ~C C↔ A F F F V V V F F V V F F F V F V F F F V V V F V V F F F V V 112 COMPUTATIONAL THINKING PREMISSAS CONCLUSÃO Linha I A C I → A ~A ∧ ~C C↔ A V F V F F F V V F V F F V V V V F V Fonte: elaborada pelo autor Podemos ver que as duas premissas do silogismo são verdadeiras apenas na linha 1 da tabela verdade. Como a conclusão também é verdadeira nessa linha, concluímos que o silogismo é válido. SAIBA MAIS Existem, além da lógica matemática clássica que esta- mos apresentando aqui, diversas outras lógicas que sur- giram no século 20, que são chamadas de lógicas não clássicas. Duas delas merecem ser mencionadas por possuírem grande importância na ciência da computa- ção: a lógica Fuzzy (ou lógica nebulosa) e a lógica para- consistente. De forma muito resumida, na lógica Fuzzy, uma proposição não está restrita a verdadeiro (1) e falso (0), podendo assumir diferentes valores nesse intervalo (por exemplo, 0,5 ou 0,8); e a lógica paraconsistente pos- sui um terceiro estado lógico além desses dois, que é a indefinição ou desconhecido. 113 ALgORITMOS E LógICA DE PROgRAMAçãO OPERADORES LÓGICOS E RELACIONAIS Uma coisa muito importante emlógica de programação é o conceito de condição. Condições são comparações entre conjuntos de valores ou variáveis que retorna um valor lógico. Essas condições são elementos-chave de estruturas condicionais, que são um dos pilares da programação estruturada. Para estabelecer uma condição, utilizamos os operadores relacionais. OPERADORES RELACIONAIS Os operadores relacionais comparam matematicamente um par de valores (ou o resultado de um par de operações) e retornam um valor lógico. Essa comparação precisa ser feita entre dados de um mesmo tipo (algumas linguagens de programação, por exemplo, não permitem a comparação entre valores inteiros e reais, apesar de ambos serem dados numéricos). Existem seis operadores relacionais, apresentados na tabela da figura 14 A notação apresentada é a utilizada no pseudocódigo. Figura 14 - Operadores relacionais OPERADOR DESCRIÇÃO = É igual a <> É diferente de 114 COMPUTATIONAL THINKING OPERADOR DESCRIÇÃO > É maior que >= É maior ou igual a < É menor que <= É menor ou igual a Fonte: elaborada pelo autor Alguns exemplos: • 123 <> 123 irá retornar o valor lógico falso; • 123 = “123” irá apresentar um erro (estamos comparando valor numérico com caractere); • “batata” > “banana” irá retornar o valor lógico verdadeiro (na comparação de caracteres, a maioria das linguagens de programação a faz utilizando a ordem alfabética). Um cuidado que temos que tomar é com as diferenças entre maior e maior ou igual (e com menor e menor ou igual). Precisa estar bem claro qual o valor envolvido na comparação, pois o uso do operador incorreto irá produzir uma resposta errada: • 100 > 100 irá retornar o valor falso; 115 ALgORITMOS E LógICA DE PROgRAMAçãO • 100 >= 100 irá retornar o valor lógico verdadeiro; • 100 < 100 irá retornar o valor falso; • 100 <= 100 irá retornar o valor lógico verdadeiro. Na maioria das linguagens de programação, esses operadores podem ser utilizados para estabelecer uma relação entre apenas dois elementos (algumas apresentam exceções, como, por exemplo, o Python, que permite definir um intervalo numérico). Dessa forma, comparações que envolvam três ou mais elementos não podem ser realizadas diretamente por meio destes operadores apenas. OPERADORES LÓGICOS EM CONDIÇÕES Uma situação interessante no desenvolvimento de algoritmos é a necessidade de verificar se um valor numérico pertence ou não a um intervalo pré-definido. Todo intervalo possui, obviamente, um limite superior e inferior. Assim, como fazer para comparar três valores (o número a ser testados e os dois limites do intervalo) utilizando os operadores relacionais? 116 COMPUTATIONAL THINKING Uma forma de resolver esse problema é dividindo a condição em duas ou mais condições nas quais se comparam apenas dois elementos em cada e conectá-las por meios dos operadores lógicos. Dos seis operadores lógicos apresentados anteriormente neste livro, quatro estão universalmente presentes nas linguagens de programação: Negação, E, Ou e Ou Exclusivo. Assim, suponhamos que queremos testar se a varivel01 (numérica) está no intervalo delimitado por X e Y, ou seja X < variavel01 < Y. Nesse caso, dividimos essa condição em duas: (X < variavel01) e (variavel01 < Y), uma para testar se variável está acima do limite inferior X e a outra para testar se a variável está abaixo do limite superior Y. Precisamos que a associação dessas duas condições resulte em verdadeira apenas quando ambas forem verdadeiras. Consultando as tabelas verdade dos operadores lógicos no tópico “operadores lógicos”, verificamos que o operador lógico que satisfaz essa necessidade é o operador E. Assim, a condição composta que definirá o intervalo será (X < variavel01) E (variavel01 < Y). O operador lógico Ou é utilizado usualmente quando temos duas condições distintas e queremos verificar se ao menos uma delas é verdadeira. Por exemplo, para verificarmos, no caso de um algoritmo que peça uma senha, se a senha correta já foi digitada ou 117 ALgORITMOS E LógICA DE PROgRAMAçãO se o número máximo de tentativas foi atingido: (senha = “senha correta”) OU (tentativas <= “máximo de tentativas”). Por fim, o operador lógico da negação permite que façamos a substituição de uma condição por outra equivalente “invertendo” o operador relacional. Por exemplo, as condições (A > 2000) e não(A <= 2000) são equivalentes. OPERADORES LÓGICOS COM MAIS DE DUAS CONDIÇÕES Muitas vezes, precisamos conectar mais do que duas condições por meio de operadores lógicos. Considerando apenas os operadores lógicos utilizados usualmente na programação, podemos expandir suas regras de funcionamento da seguinte forma: • Negação: não se altera, pois atua como um operador unário (apenas sobre um único elemento). • E: a regra continua a mesma quando extrapolada para uma quantidade maior de proposições ou condições: só será verdadeiro quando todas as proposições forem verdadeiras, independente de 118 COMPUTATIONAL THINKING quantas sejam; assim, basta que uma das proposições associadas seja falsa para que a associação seja falsa. • Ou: também podemos extrapolar a regra, a associação só será falsa quando todas as proposições associadas forem falsas, sendo essa verdadeira se ao menos uma das proposições for verdadeira. • Ou Exclusivo: a extrapolação pode ser obtida por meio da associatividade (A (+) (B (+) C), por exemplo). Uma regra prática: a associação será verdadeira quando a quantidade de proposições verdadeiras for ímpar. PRECEDÊNCIA ENTRE DIFERENTES OPERADORES Ao escrevermos um algoritmo ou programa de computador, é comum termos que lidar com situações em que diferentes tipos de operadores interagem na mesma instrução ou linha de código. Vimos as precedências dentro de um mesmo tipo de operador, agora precisamos saber quais as regras de precedência entre os diferentes tipos. Essa ordem de resolução de expressões é a seguinte: 1. operações entre parênteses, se houver; 2. operadores aritméticos; 119 ALgORITMOS E LógICA DE PROgRAMAçãO 3. operadores relacionais; 4. operadores lógicos; 5. operador de atribuição. Vamos dar um exemplo: considere o seguinte trecho de um algoritmo: A <- 12 B <-25 C <- 10 D <- (A + B < C * B) E (A + B * C = C + A**2) Primeiro resolveremos os operadores aritméticos, em seguida os operadores lógicos e depois os relacionais. O operador de atribuição por fim irá atribuir à variável D um valor lógico resultante das operações anteriores. Fazendo passo a passo: D <- (12 + 25 < 10 * 25) E (12 + 25 * 10 = 10 + 12**2) D <- (12 + 25 < 250) E (12 + 250 = 10 + 144) D <- (37 < 250) E (262 = 154) D <- (VERDADEIRO) E (FALSO) D <- FALSO 120 COMPUTATIONAL THINKING USO DE CONDIÇÕES EM ESTRUTURAS DE SELEÇÃO As condições apresentadas neste tópico estão vinculadas a um dos pilares da programação estruturada, que são as estruturas de seleção (ou estruturas condicionais). Não vamos detalhar essa estrutura aqui, apenas faremos uma rápida apresentação para demonstrar a aplicação prática dos conceitos vistos neste estudo. Uma estrutura de seleção cria uma ramificação no fluxo de um algoritmo baseado no resultado de uma condição: se uma condição for verdadeira, um conjunto de instruções será realizado; senão um outro conjunto de instruções (diferente) será realizado. Em resumo, (em uma versão aproximada de pseudocódigo): SE (CONDIÇÃO FOR VERDADEIRA) ENTÃO FAÇA (CONJUNTO DE INSTRUÇÕES 1) SENÃO FAÇA (CONJUNTO DE INSTRUÇÕES 2) Existem outros formatos de estruturas de seleção além deste apresentado. O uso de condições também se aplica ao outro pilar da programação estruturada que são as estruturas de repetição (nesse caso, por exemplo, um conjunto de 121 ALgORITMOS E LógICA DE PROgRAMAçãO instruções será repetido enquanto uma dada condição de controle for verdadeira). Ou seja: ENQUANTO (CONDIÇÃO FOR VERDADEIRA) REPITA (CONJUNTO DE INSTRUÇÕES) Finalizando, podemos concluir que todosos conteúdos apresentados neste livro convergem para um uso concreto na lógica de programação e no desenvolvimento de programas de computador. CONSIDERAÇÕES FINAIS Neste estudo, nos propusemos a desenvolver dois temas principais: os fundamentos da lógica de programação e sua aplicabilidade em algoritmos, e a lógica matemática. Referente ao tema de lógica de programação, foi feita uma revisão dos conceitos fundamentais de algoritmo, dado e variável para, dando continuidade, apresentar o conceito de operadores e formas de se representar um algoritmo, com ênfase no pseudocódigo e em fluxogramas. Vimos também 122 COMPUTATIONAL THINKING diferentes ferramentas, sugeridas pelo autor, para representar, implementar e testar algoritmos. A lógica matemática foi o assunto principal, ocupando metade deste livro. Partiu-se de uma breve introdução histórica, da definição do que é uma proposição, seguindo com a apresentação dos principais operadores lógicos da lógica proposicional. O conceito de expressões lógica, que é associação de proposições por meio dos operadores foi o tema seguinte, com a apresentação das leis das lógicas e algumas regras básicas para simplificar essas expressões, por meio da substituição por uma expressão equivalente com menos operadores. Além disso, foram também mencionados superficialmente alguns outros assuntos relacionados à lógica, como sua aplicação em circuitos digitais e outros tipos de lógicas diferentes da lógica matemática clássica. O último tópico deste livro fez a ligação entre os dois temas, apresentando o uso de operadores relacionais e lógicos na construção de condições, que são elementos de algoritmos que retornam um valor lógico verdadeiro ou falso. Finalizando, fizemos uma breve introdução às estruturas de seleção, que são a principal aplicação das condições em algoritmos e programas de computador. Esse assunto por si só precisaria de uma quantidade de páginas igual ao que utilizamos aqui para ser 123 ALgORITMOS E LógICA DE PROgRAMAçãO adequadamente tratado; assim, este tema será deixado apenas na apresentação. Muito obrigado! REFERÊNCIAS BISPO, Carlos Alberto F.; CASTANHEIRA, L. B.; SOUZA FILHO O. M. Introdução à lógica matemática. São Paulo: Cengage Learning, 2013. SILVA, F. S. C.; FINGER, M.; MELO, A. C. V. D. Lógica para computação. 2. ed. São Paulo: Cengage Learning Brasil, 2018. DASGUPTA, S.; PAPADIMITRIOU C.; VAZIRANI U. Algoritmos. Porto Alegre, RS: AMGH, 2011. FEOFILOFF, P. Algoritmos em linguagem C. Rio de Janeiro: Elsevier, 2009. IDOETA, I. V.; CAPUANO, F. G. Elementos de eletrônica digital. São Paulo: Érica, 2019. 124 COMPUTATIONAL THINKING LIPSCHUTZ, S. LIPSON, M. Matemática Discreta. Porto Alegre: Bookman, 2013. LUCIDCHART. 2022. Disponível em31 maio 2024.rt.com. Acesso em: 05 maio 2022. MANZANO, J. A. N. G.; OLIVEIRA, J. F. Algoritmos: lógica para desenvolvimento de programação de computadores. 29. ed. São Paulo: Érica, 2019. MOKARZEL, F.; SOMA, N. Introdução à Ciência da Computação. Rio de Janeiro: Ed ELSEVIER, 2008. NICOLODI, A. C. Manual do VisuAlg 3.0. 2016. Disponível em: https://manual.visualg3.com.br/. Acesso em: 31 maio 2024. PORTUGOL WEBSTUDIO. 2014. Disponível em: https:// portugol-webstudio.cubos.io. Acesso em: 31 maio 2024. SEBESTA, R. W. Conceitos de linguagens de programação. Porto Alegre: Bookman, 2011. TORRES, F. E. et al. Pensamento Computacional. Porto Alegre: SAGAH, 2019.VISUALG. VisuAlg 3.0. 2017. Disponível em: https://visualg3.com.br/. Acesso em: 31 maio 2024. Lógica e pensamento computacional Introdução Introdução à computação e à programação Bits e Bytes Sistema binário de numeração Paradigmas de programação Linguagens de baixo e alto nível Paradigmas de linguagens de programação Estrutura sequencial Algoritmos Implementação de um algoritmo Tipos de dados e variáveis Tipos de dados primitivos Tipos de dados compostos Tipagem de uma linguagem de programação Entrada e saída de dados Pseudocódigo Atribuição de dados Instruções de entrada e saída de dados Exemplo de algoritmo Considerações finais Referências Algoritmos e lógica de programação Introdução Definição de algoritmos e operadores Algoritmos e dados Variáveis Operadores Formas de representação de um algoritmo Pseudocódigo Fluxograma Exemplo da representação de um algoritmo Ferramentas para a construção de algoritmos VisuAlg Portugol WebStudio Lucidchart Pacote Office Fundamentos de lógica proposicional Um pouco de história Proposição Tabela verdade Operadores lógicos Precedência dos operadores lógicos Equivalência de expressões lógicas Implicação lógica e argumentos Operadores lógicos e relacionais Operadores lógicos em condições Operadores Lógicos com mais de duas condições Precedência entre diferentes operadores Uso de condições em estruturas de seleção CONSIDERAÇÕES FINAIS REFERÊNCIAS Estruturas condicionais e de repetição Introdução Estrutura condicional simples Condições Estrutura se-então Estrutura se-então-senão Estruturas condicionais compostas Resumo de operadores lógicos Condições compostas Estruturas condicionais encadeadas Aplicação de condicionais encadeados Alguns exemplos de aplicação Estrutura condicional por seleção Estruturas de seleção em pseudocódigo Exemplo de uso Estrutura condicional com repetição Estrutura enquanto Exemplos de aplicação da estrutura enquanto Considerações finais Referências Estruturas de repetição, funções e vetores Introdução Estrutura de repetição simples Contadores Estrutura de repetição incondicional Acumuladores Estruturas de repetição encadeadas Teste de condição no início e no término da iteração Estrutura Enquanto com contador Estrutura Repita Funções e procedimentos Funções Procedimentos Vetores Aplicação e manipulação de vetores Matrizes Funções para uso com matrizes Preenchimento da matriz Exibição da matriz Busca na matriz Algoritmo Bubble Sort Algoritmo com o uso das funções e procedimentos CONSIDERAÇÕES FINAIS REFERÊNCIAS