UEM – Universidade Estadual de Maringá DIN - Departamento de Informática Disciplina: Fundamentos da Computação Profª Thelma Elita Colanzi Lopes [email protected] Aula 4 Lógica de Programação O objetivo principal da Lógica de Programação é demonstrar técnicas para resolução de problemas e conseqüentemente automatização de tarefas. O aprendizado da Lógica é essencial para formação de um bom programador, servindo como base para o aprendizado de todas as linguagens de programação, estruturadas ou não. De um modo geral esses conhecimentos serão importantes, pois nos ajudarão no cotidiano, desenvolvendo um raciocínio rápido. Algoritmos Um Algoritmo é uma seqüência de instruções ordenadas de forma lógica para a resolução de uma determinada tarefa ou problema. Os algoritmos surgiram no século IX, muito antes dos computadores, com o matemático Árabe de sobrenome Al-Khowarizmi, que desenvolveu um conjunto de regras para efetuar operações aritméticas com números decimais. Pode-se ainda descrever algoritmos como uma descrição de um procedimento padrão, passo a passo, de forma detalhada e sem ambigüidade devendo ainda ter execução finita para quaisquer valores de dados. Os algoritmos são aplicados em várias áreas, como a física e a matemática. Um relatório de física, por exemplo, pode ser visto como um algoritmo, do ponto de vista que a intenção de um relatório é permitir que alguém repita a experiência relatada e obtenha os mesmos resultados. A programação de computadores é apenas um dos campos de aplicação dos algoritmos. Sendo assim, um algoritmo pode ser computacional — quando é representado por uma linguagem de programação e pode ser executado no computador (chamamos de programa); ou não computacional — quando somente uma seqüência de instruções é descrita de forma lógica mais não totalmente formal. A formulação de um algoritmo geralmente consiste em um texto contendo comandos (instruções) que devem ser executados numa seqüência prescrita (receita). A seguir apresenta-se um algoritmo não computacional para fritar batatas: Início Recolha as batatas na geladeira; Coloque as batatas em uma bacia; Descasque as batatas; Lave as batatas; Fatie as batatas; Coloque o óleo na panela para esquentar; Enxugue as batatas; Jogue as batatas na panela com óleo, com cuidado; Mexa as batatas até ficarem fritas; Retire as batatas; Escorra o óleo; Coloque as batatas em um recipiente com toalha de papel; Fim. Abaixo é apresentado um Algoritmo não computacional cujo objetivo é usar um telefone público. Início Tirar o fone do gancho; Ouvir o sinal de linha; Introduzir o cartão; Teclar o número desejado; Se der o sinal de chamar 5.1 Conversar; Desvio 5.2 Desligar; 5.3 Retirar o cartão; 6. Senão 6.1 Repetir; Fim. Computacionalmente falando, um algoritmo não é uma solução para um problema, mas um caminho para obtê-la. Sendo assim, podem existir vários caminhos para uma mesma solução, e conseqüentemente, vários algoritmos diferentes para o mesmo problema. Como um exemplo, podemos destacar os vários métodos de multiplicação existentes: método americano (resolução direita para a esquerda), método inglês (resolução da esquerda para a direita) e o método russo (dividir o multiplicando por 2 e multiplicar o multiplicador por 2 até que o multiplicando se torne 1 – somar os multiplicadores onde o multiplicando é impar). Outro exemplo seria a rotina que cada pessoa segue para tomar banho, trocar um pneu ou executar uma receita de bolo. Representação de Algoritmos Os algoritmos podem ser representados de forma gráfica ou textual. Na forma gráfica, utilizamos principalmente os fluxogramas convencionais. Na forma textual, podemos utilizar uma linguagem de programação, ou uma pseudolinguagem. início Algoritmo calc_media; variáveis n1, n2, media: real; início leia(n1, n2); media := (n1 + n2)/2; se media >= 6 então escreva(“Aprovado”) senão escreva(“Reprovado”); fim. N1, N2 Media <= (N1 + N2)/2 Media >= 6? “Aprovado” “Reprovado” fim 2 Durante nosso curso iremos aprender inicialmente a desenvolver nossos algoritmos em uma pseudolinguagem conhecida como “Portugol” ou Português Estruturado. “Portugol” é derivado da aglutinação de Português + Algol. Algol é o nome de uma linguagem de programação estruturada usada no final da década de 50 que influenciou muito a construção da linguagem Pascal. Vamos conhecer então, a sintaxe da linguagem que utilizaremos: Operadores aritméticos: + Adição Subtração * Multiplicação / Divisão Operadores relacionais: > Maior que < Menor que >= Maior ou Igual <= Menor ou Igual = Igual <> Diferente Escrevendo Expressões Para a construção de Algoritmos todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas em linhas. É importante também ressalvar o uso dos operadores correspondentes da aritmética tradicional para a computacional. Exemplo: 2 ( ) + 5 − 3 3 + 1 = Tradicional (2/3+(5-3))+1= Computacional Modularização de Expressões A modularização é a divisão da expressão em partes, proporcionando maior compreensão e definindo prioridades para resolução da mesma. Como pode ser observado no exemplo anterior, em expressões computacionais usamos somente parênteses “( )” para modularização. Na informática podemos ter parênteses dentro de parênteses. Exemplos de prioridades: (2+2)/2=2 2+2/2=3 Operadores Especiais (Mod e Div) MOD Retorna o resto da divisão inteira entre 2 números inteiros. DIV Retorna o valor inteiro que resulta da divisão entre 2 números inteiros. 3 Exemplo: 13 2 1 13 DIV 2 = 6 6 MOD 13 MOD 2 = 1 DIV Prioridade entre os operadores aritméticos e os operadores Mod e Div Na resolução de uma expressão computacional os operadores aritméticos são resolvidos com as mesmas prioridades atribuídas a eles na matemática. Assim, sempre resolvemos os operadores de divisão e multiplicação (inclusive os operadores mod e div) antes de resolvermos os operadores de soma e subtração. Funções Uma função é um instrumento (Sub–algoritmo) que tem como objetivo retornar um valor ou uma informação. A chamada de uma função é feita através da citação do seu nome seguido opcionalmente de seu argumento inicial entre parênteses. As funções podem ser predefinidas pela linguagem ou criadas pelo programador de acordo com o seu interesse. Exemplos: Valor Inicial X X=9 Processamento Valor Final Y x Y=3 Funções Pré-Definidas ABS( ) VALOR ABSOLUTO SQRT( ) RAIZ QUADRADA SQR( ) ELEVA AO QUADRADO TRUNC( ) VALOR TRUNCADO ROUND( ) VALOR ARREDONDADO LOG( ) LOGARITMO SIN( ) SENO COS( ) COSENO TAN( ) TANGENTE As funções apresentadas anteriormente são as mais comuns e importantes para nosso desenvolvimento lógico, entretanto, cada linguagem possui suas funções próprias. As funções podem ser aritméticas, temporais, de texto e etc. 4 Operadores Lógicos Atuam sobre expressões retornando sempre valores lógicos como Falso ou Verdadeiro. E Retorna verdadeiro se ambas as partes forem verdadeiras. OU Basta que uma parte seja verdadeira para retornar verdadeiro. NÃO Inverte o estado, de verdadeiro passa para falso e vice-versa. Tabela Verdade A V V F F B V F V F AEB V F F F A OU B V V V F NÃO (A) F F V V Expressões Lógicas As expressões compostas de relações sempre retornam um valor lógico. Exemplos: 2+5>4 Verdadeiro 3<>3 Falso De acordo com a necessidade, as expressões podem ser unidas pelos operadores lógicos. Exemplos: 2+5>4 E 3<>3 Falso 2+5>4 OU 3<>3 Verdadeiro V F V F E OU F V NÃO(3<>3) Verdadeiro F NÃO V 5 Variáveis Variáveis são endereços de memória destinados a armazenar informações temporariamente. As variáveis de um algoritmo representam os dados que devem ser armazenados na memória do computador para posterior processamento durante a execução do algoritmo. Para o armazenamento desses dados é preciso saber qual o seu tipo e como eles poderão ser identificados para viabilizar a sua utilização e manipulação a qualquer momento. Para que a programação se torne mais fácil podemos colocar nomes legíveis (que nós podemos entender) nesses endereços de memória e utiliza-los no algoritmo. Uma variável sempre está associada a 4 características: O nome da variável: necessário para diferencia-la das demais; O endereço da variável: necessário para localizar a variável na memória principal; O tipo de dado associado à variável: indica o tipo de informação que pode ser armazenada naquela área de memória e é necessário para que o compilador trate cada variável de acordo com o seu tipo; O conteúdo da variável: é a informação efetivamente guardada na variável; A declaração em pseudolinguagem das variáveis utilizadas em um algoritmo e seus respectivos tipos é sempre precedida pela palavra “variáveis”, e é feita logo no início do algoritmo. Exemplo: Variáveis Salário: real; Idade: inteiro; Nome: cadeia; Sexo: caracter; Variáveis de Entrada e Saída Variáveis de entrada armazenam informações fornecidas por um meio externo (normalmente usuários ou discos). No exemplo da média, as variáveis N1 e N2 são variáveis de entrada. Variáveis de saída armazenam dados processados como resultados. No exemplo da média a variável media é uma variável de saída. Constantes Constantes são endereços de memória destinados a armazenar informações fixas, inalteráveis durante a execução do programa. Exemplo: PI = 3.1416 A declaração em pseudolinguagem das constantes utilizadas em um algoritmo sempre precedida pela palavra “constantes”, e é feita logo no início do algoritmo, antes da declaração das variáveis. Exemplo: Constantes pi=3.1416; Variáveis Salário: real; Idade: inteiro; 6 Identificadores São os nomes dados a variáveis, constantes e algoritmos. Regras para construção de Identificadores: Não podem ter nomes de palavras reservadas (comandos da linguagem); Devem possuir como 1º caractere uma letra ou Underscore ( _ ); Ter como demais caracteres letras, números ou Underscore; Ter no máximo 127 caracteres; Não possuir espaços em branco; A escolha de letras maiúsculas ou minúsculas é indiferente. Exemplos: nome telefone idade_filho nota1 salario pi umnomemuitocompridoedificildeler um_nome_muito_comprido_e_facil_de_ler Tipos de Dados Todas as variáveis devem assumir um determinado tipo de informação. O tipo de dado pode ser: Primitivo Pré-definido pela linguagem; Sub-Faixa É uma parte de um tipo já existente; PRIMITIVO Escalar Definidos pelo programador. Exemplos: A : INTEIRO SUB - FAIXA TIPO NOTA = [1..10] DE INTEIRO TIPO SEMANA = (Segunda-feira, Terça-feira, Quarta-feira, Quinta-feira, Sexta-feira, Sábado, Domingo) ESCALAR Tipos Primitivos de Dados Inteiro: Admite somente números inteiros. Geralmente é utilizado para representar uma contagem (quantidade). Real: Admite números reais (com ou sem casas decimais). Geralmente é utilizado para representar uma medição. Caractere: Admite caracteres alfanuméricos. (0..9, A..Z, a..z, !, @, #, $, %, ¨, &, *, (, ), _, +, {, }, [, ]...) Os números quando declarados como caracteres tornam se representativos e perdem a atribuição de valor. Cadeia: Admite uma seqüência de caracteres. Lógico: Admite somente valores lógicos (verdadeiro/falso). Comandos de Entrada e Saída LEIA Comando de entrada que permite a leitura de Variáveis de Entrada. Exemplo: leia(n1, n2); ESCREVA Comando de saída que exibe uma informação na tela do monitor. Exemplo: escreva(media); 7 Sinal de Atribuição Uma Variável nunca é eternamente igual a um valor, seu conteúdo pode ser alterado a qualquer momento. Portanto para atribuir valores a variáveis devemos usar o sinal de “:=”. Exemplos: A := 2; B := 3; C := A + B; D := pi; Corpo Geral de um Programa PROGRAMA <<identificador>>; CONST <<identificador>> = <<dado>>; VAR <<identificador>> : <<tipo>>; ÍNICIO { COMANDOS DE ENTRADA,PROCESSAMENTO E SAÍDA <<comando1>>; <<comandoN>> } FIM. Estruturas Seqüenciais Como pode ser analisado no tópico anterior, todo programa possui uma estrutura seqüencial determinada por um ÍNICIO e FIM. Ponto e vírgula ; O sinal de ponto e vírgula “;” indica a existência de um próximo comando (passa para o próximo). Na estrutura ÍNICIO não se usa “;”. Primeiro Algoritmo Segue um Algoritmo que lê o nome e as 4 notas bimestrais de um aluno. Em seguida o Algoritmo calcula e escreve a média obtida. programa media_final; var nota1, nota2, nota3, nota4, media: inteiro; nome : caractere [35]; inicio leia (nome); leia (nota1, nota2, nota3, nota4); media := (nota1 + nota2 + nota3 + nota4) / 4; escreva (nome, media); fim. 8 Segundo Algoritmo Segue um Algoritmo que lê o raio de uma circunferência e calcula sua área. programa area_circunferencia; const pi = 3.1416; var raio, area : real; inicio leia (raio); {processamento} area := pi * sqr(raio); {entrada} escreva (‘area =’, area) {saída} fim. {Linhas de Comentário} Podemos inserir em um Algoritmo comentários para aumentar a compreensão do mesmo, para isso basta que o texto fique entre Chaves “{}”. Exemplo: ler (raio); {entrada} ‘Aspas simples’ Quando queremos exibir uma mensagem para a tela ela deve estar contida entre aspas simples, caso contrário, o computador irá identificar a mensagem como Variável Indefinida. Exemplo: escrever (‘area obtida =’, area) {comando de saída} area obtida = x.xx {resultado gerado na tela} Texto baseado na apostila do professor Alysson Paradzinski 9