Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Programac¸a˜o Computacional Aula 01 - 08/ago/2017 Wilson H. Hirota Universidade Federal de Sa˜o Paulo wilson.hirota@gmail.com Apresentac¸a˜o do Curso • Objetivos Gerais ◦ Capacitar o aluno na elaborac¸a˜o de algoritmos computacionais e te´cnicas elementares de programac¸a˜o computacional • Objetivos espec´ıficos ◦ Apresentar os principais conceitos de algoritmos computacionais e linguagens de programac¸a˜o ◦ Capacitar os alunos a utilizarem as ferramentas dispon´ıveis para as demais unidades curriculares do curso • Metodologia ◦ Aulas teo´ricas expositivas e aulas pra´ticas, com resoluc¸a˜o e discussa˜o de exerc´ıcios • Moodle ◦ Algoritmos e Programac¸a˜o Computacional ◦ Co´digo de inscric¸a˜o: 2 / 63 Datas Agosto D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Novembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Setembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Dezembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Outubro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Aulas Pra´ticas 19/set. - Laborato´rio 01 24/out. - Laborato´rio 02 14/nov. - Laborato´rio 03 21/nov. - Laborato´rio 04 Aulas pra´ticas: salas de informa´tica da unidade Eldorado 3 / 63 Datas Agosto D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Novembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Setembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Dezembro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Outubro D S T Q Q S S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Provas 10/outubro - Prova 01 28/novembro - Prova 02 05/dezembro - Substitutiva 12/dezembro - Exame 1. Prova de conteu´do acumulativo 2. Prova substitutiva fechada 4 / 63 Crite´rios de avaliac¸a˜o e aprovac¸a˜o M.Ex.: Me´dia aritme´tica dos Exerc´ıcios (Aula Pra´tica) M.L = L1 + L2 + 2× L3 4 M.P. = P1 + 2× P2 3 Contato Laborato´rio de Engenha- ria de Controle Ambiental (LENCA) Unidade Jose´ de Alencar, 3o andar wilson.hirota@gmail.com 5 / 63 Cuidados / Dicas • O grande problema apresentado pelos estudantes na˜o sa˜o as linguagens de programac¸a˜o ou a descric¸a˜o de algoritmos, mas sim a dificuldade em abstrair e descrever as soluc¸o˜es do problema contando apenas com poucas e simples estruturas • O que deve ser percebido e´ que um novo problema de programac¸a˜o pode ser gerado a partir de um ja´ existente, alterando-se apenas poucos elementos de seu enunciado Cuidado Dessa forma, e´ um erro decorar as soluc¸o˜es, pois podem na˜o servir para outros problemas, que com certeza sera˜o diferentes 6 / 63 Cuidados / Dicas • O que deve ser procurado e´ o entendimento de como foi obtida uma soluc¸a˜o, armazena´-la na memo´ria e, enta˜o, utilizar essa experieˆncia adaptando-a a outras situac¸o˜es, por analogia, generalizac¸a˜o ou especializac¸a˜o • A grande dica e´ que um problema pode ser diferente de outro, mas consegue-se aproveitar grande parte da experieˆncia obtida em problemas passados em novos desafios • Em programac¸a˜o, na˜o existe uma “fo´rmula ma´gica” para resolver problemas. De qualquer forma, apresenta-se a seguir um conjunto de dicas que podem ser utilizadas durante o processo de racioc´ınio empregado na resoluc¸a˜o de problemas 7 / 63 Cuidados / Dicas • Ao se deparar com um problema novo, tente entendeˆ-lo. Para auxiliar, pense no seguinte: ◦ O que se deve descobrir ou calcular? Qual o objetivo? ◦ Quais sa˜o os dados dispon´ıveis? Sa˜o suficientes? ◦ Quais as condic¸o˜es necessa´rias e suficientes para resolver o problema? ◦ Fac¸a um esboc¸o informal de como ligar os dados com as condic¸o˜es ◦ Se poss´ıvel, modele o problema de forma matema´tica 8 / 63 Cuidados / Dicas • Crie um plano com a soluc¸a˜o ◦ Consulte sua memo´ria e verifique se voceˆ ja´ resolveu algum problema similar. A sua soluc¸a˜o pode ser aproveitada: i) por analogia, quando o enunciado for diferente, mas a estrutura em si guarda similaridades; ii) por generalizac¸a˜o quando se tem uma soluc¸a˜o particular e deseja uma soluc¸a˜o geral; iii) por especializac¸a˜o, quando se conhece alguma soluc¸a˜o geral que serve como base para uma particular ◦ Verifique se e´ necessa´rio introduzir algum elemento novo no problema, como um problema auxiliar ◦ Se o problema for muito complicado, tente quebra´-lo em partes menores e solucionar essas partes 9 / 63 Cuidados / Dicas • Formalize a soluc¸a˜o ◦ Crie um algoritmo informal com passos que resolvam o problema ◦ Verifique se cada passo desse algoritmo esta´ correto ◦ Escreva um algoritmo formalizado por meio de um fluxograma ou pseudoco´digo 10 / 63 Cuidados / Dicas • Examine os resultados ◦ Teste o algoritmo com diversos dados de entrada e verifique os resultados (simulac¸a˜o) ◦ Se o algoritmo na˜o gerou resultado algum, o problema esta´ na sua sintaxe e nos comandos utilizados. Volte e tente encontrar o erro ◦ Se o algoritmo gerou resultados, estes esta˜o corretos? Analise sua consisteˆncia ◦ Se na˜o esta˜o corretos, alguma condic¸a˜o, operac¸a˜o ou ordem das operac¸o˜es esta´ incorreta. Volte e tente encontrar o erro 11 / 63 Introduc¸a˜o • Um programa de computador e´ um conjunto de instruc¸o˜es e dados criado por um ser humano que, ao ser executado por alguma ma´quina, cumpre um determinado objetivo • Os dados sa˜o organizados em um computador de acordo com sua representac¸a˜o bina´ria, isto e´, sequeˆncias de 0s e 1s. Portanto, a principal tarefa do computador e´ extrair as informac¸o˜es resultantes das execuc¸o˜es das intruc¸o˜es de um programa 1 • Parte dos dados processados durante a execuc¸a˜o de um software e´ fornecida pelo ser humano (ou outra ma´quina) e denominada dados de entrada. Por outro lado, os dados de sa´ıda sa˜o aqueles fornecidos ao ser humano (ou outra ma´quina) apo´s o processamento dos dados de entrada • O software deve ser encarado como um produto de um processo bem-definido e controlado de engenharia 1 Dado e´ um valor qualquer armazenado em um computador enquanto a informac¸a˜o representa a interpretac¸a˜o desse dado, ou seja, qual o seu significado 12 / 63 Algoritmos e Lo´gica de Programac¸a˜o • O estudo de algoritmos e de lo´gica de programac¸a˜o e´ essencial no contexto do processo de criac¸a˜o de um software, pois permite verificar, em um n´ıvel maior de abstrac¸a˜o, se o software esta´ correto ou na˜o; permite, inclusive, averigar se o software atendera´ a`s especificac¸o˜es originalmente propostas. Assim, evita-se partir diretamente para a etapa de implementac¸a˜o, o que podera´ ocasionar mais erros no produto final • Muitas definic¸o˜es podem ser dadas a` palavra algoritmo. Atualmente, tem-se associado algoritmo a` computac¸a˜o, mas este na˜o e´ um termo restrito a` computac¸a˜o ou que tenha nascido com ela • Na realidade, a palavra algoritmo vem do nome do matema´tico iraniano Abu Abdullah Mohammad Ibn Musa al-Khawarizmi, nascido em Khawarizm, ao sul do mar Aral, que viveu no se´culo XVII. Tambe´m e´ considerado o fundador da a´lgebra, cujo nome derivou de seu livro Al-Jabr wa-al-Muqabilah 13 / 63 Algoritmos e Lo´gica de Programac¸a˜o• O termo algoritmo tambe´m e´ utilizado em outras a´reas, como engenharia, administrac¸a˜o, entre outras. Vejamos algumas definic¸o˜es de algoritmo Definic¸a˜o 1 1. Mat. Processo de ca´lculo ou de resoluc¸a˜o de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restric¸o˜es, re- gras formais para a obtenc¸a˜o do resultado ou da soluc¸a˜o do problema. 2. Inform. Conjunto de regras e operac¸o˜es bem definidas e ordenadas, desti- nadas a` soluc¸a˜o de um problema ou de uma classe de problemas, em um nu´mero finito de etapas. 14 / 63 Algoritmos e Lo´gica de Programac¸a˜o • O termo algoritmo tambe´m e´ utilizado em outras a´reas, como engenharia, administrac¸a˜o, entre outras. Vejamos algumas definic¸o˜es de algoritmo Definic¸a˜o 2 Sequeˆncia na˜o amb´ıgua e ordenada de instruc¸o˜es destinada a` soluc¸a˜o de um problema, ou uma classe de problemas, em um nu´mero finito de passos. • Em outras palavras, um algoritmo na˜o representa necessariamente um programa de computador, mas o caminho de soluc¸a˜o para um problema • Dessa forma, uma receita de bolo e´ um exemplo de um algoritmo, pois descreve as regras necessa´rias para a conclusa˜o de um objetivo: a preparac¸a˜o de um bolo. Se essas instruc¸o˜es tiverem sua ordem trocada ou a quantidade dos ingredientes alterada, o resultado vai divergir do original 15 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Das definic¸o˜es expostas anteriormente, pode-se extrair as seguintes caracter´ısticas evidentes ◦ Um algoritmo representa uma sequeˆncia de regras. ◦ Essas regras devem ser executadas em uma ordem preestabelecida. ◦ Cada algoritmo possui um conjunto finito de regras. ◦ Essas regras devem possuir um significado e ser formalizadas segundo alguma convenc¸a˜o. • Todo algoritmo possui as seguintes propriedades ◦ Valores de entrada: todo algoritmo deve possuir zero, uma ou mais entradas de dados. A receita de bolo representa um algoritmo que possui zero entradas, pois seu algoritmo opera com quantidades fixas de ingredientes. ◦ Valores de sa´ıda: todo algoritmo possui uma ou mais sa´ıdas, que simboliza(m) seu(s) resultado(s). Por exemplo, a sa´ıda da receita de bolo e´ o pro´prio bolo. 16 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Todo algoritmo possui as seguintes propriedades ◦ Finitude: todo algoritmo possui um in´ıcio, meio e fim. Portanto, todo algoritmo deve ser finito, isto e´, deve possuir um in´ıcio e um conjunto de passos que, ao serem executados, levara˜o sempre ao seu te´rmino, executando a tarefa a que se propo˜e. Deve-se dedicar uma atenc¸a˜o especial a essa propriedade. Muitas vezes, por erros de lo´gica, pode-se criar um algoritmo que nunca chegara´ a um resultado (loop infinito). ◦ Passos elementares: um algoritmo computacional deve ser explicitado por meio de operac¸o˜es elementares (operac¸o˜es matema´ticas e comparac¸o˜es) ◦ Correc¸a˜o: um algoritmo deve ser correto, isto e´, deve permitir que, com sua execuc¸a˜o, se chegue a`(s) sa´ıda(s) com resultados coerentes com a(s) entrada(s). Para saber se um algoritmo esta´ correto ou na˜o, deve-se realizar testes com diversos valores de entrada (Simulac¸a˜o), cujos valores ja´ se conhece a priori e, enta˜o, comparar esses resultados com os valores produzidos pelo algoritmo em questa˜o 17 / 63 Algoritmos e Lo´gica de Programac¸a˜o • O processo de criac¸a˜o de um algoritmo e´ uma tarefa essencialmente intelectual e envolve os seguintes passos: ◦ Ana´lise e s´ıntese do problema: na fase de ana´lise, o problema e´ entendido de forma que se descubra o que deve ser solucionado, quais sa˜o os dados necessa´rios e as condic¸o˜es para resolveˆ-lo. Nessa fase, faz-se uso direto de processos de abstrac¸a˜o, o que significa elaborar modelos mentais do problema em questa˜o e do encaminhamento de sua soluc¸a˜o. Portanto, como resultado dessa fase, tem-se a elaborac¸a˜o de um plano de ac¸a˜o. Na fase de s´ıntese, executa-se o plano definido na etapa de ana´lise, representando o passo-a-passo por meio de um algoritmo. E´ importante que a soluc¸a˜o seja verificada e comprovada, por meio da execuc¸a˜o do algoritmo. Essa execuc¸a˜o e´ feita percorrendo-se o algoritmo do seu in´ıcio ate´ o seu fim, e verificando, a cada passo, se o resultado esperado foi obtido. Caso tenha sido encontrada alguma discrepaˆncia, deve-se procurar saber qual foi sua causa e eventualmente analisar novamente o problema, repetindo-se assim esse ciclo ate´ que a soluc¸a˜o tenha sido obtida 18 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Modelagem: nas cieˆncias exatas, o uso da linguagem matema´tica e´ fundamental, principalmente pela eliminac¸a˜o de duplos sentidos que acontecessem nessa pra´tica. O mesmo ocorre na computac¸a˜o, com o emprego de linguagens de descric¸a˜o de algoritmos (como fluxogramas) e de linguagens de programac¸a˜o (como linguagem C/C++). Como um exemplo de modelagem, considere o seguinte problema: Compraram-se 30 canetas iguais, que foram pagas com uma nota de R$ 100,00, obtendo-se R$ 67,00 como troco. Quanto custou cada caneta? 19 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Modelagem Compraram-se 30 canetas iguais, que foram pagas com uma nota de R$ 100,00, obtendo-se R$ 67,00 como troco. Quanto custou cada caneta? • Este problema e´ bem simples; pore´m como pode ser mostrada a soluc¸a˜o? Uma poss´ıvel resposta: Se eu tinha R$ 100,00 e recebi como troco R$ 67,00, o custo total das canetas e´ a diferenc¸a entre os R$ 100,00 que eu tinha e os R$ 67,00 do troco. Ora, isto vale R$ 33,00; portanto, esse valor foi o total pago pelas canetas. Para saber quanto custou cada caneta, basta dividir os R$ 33,00 por 30. Assim, cada caneta custou o equivalente a R$ 1,10. 20 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Modelagem • Esse racioc´ınio e´ matematicamente demonstrado por: seja x o custo de cada caneta, enta˜o quanto gastei = 30x. Como quanto gastei + troco = R$ 100,00, tem-se: 30x + 67 = 100 30x = 100− 67 30x = 33 x = 33/30 x = 1.1 • De uma forma mais curta e universalmente entendida, pode-se tambe´m dizer que o caminho pode ser obtido pelo seguinte algoritmo: INICIO Pegar os valores 30, 100 e 67 Subtrair 67 de 100 e dividir o resultado por 30 Mostrar o resultado final FIM 21 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Modelagem • Deve-se observar que o algoritmo acima resolve apenas uma instaˆncia particular do problema. Para solucionar um caso geral, tem-se o seguinte: Compraram-se N canetas iguais, que foram pagas com uma nota de Z reais, obtendo-se Y reais como troco. Quanto custou cada caneta? • Nesse caso, basta que sejam fornecidos os valores das varia´veis N , Z e Y que a soluc¸a˜o do problema e´ a mesma que a anterior e seu algoritmo pode ser escrito da seguinte forma: INICIO Ler os valores de N, Y e Z Subtrair Y de Z e dividir o resultado por N Mostrar o resultado final FIM 22 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Modelagem INICIO Ler os valores de N, Y e Z Subtrair Y de Z e dividir o resultado por N Mostrar o resultado final FIM ◦ No entanto, o algoritmo acima tem uma se´rie de restric¸o˜es: • O que acontece se algue´m pensar em comprar zero canetas, ou -3 canetas? Faz algum sentido? • Suponha que algue´m execute o algoritmo com os seguintes dados N = 10, Z = 10 e Y = 15. O valor de cada caneta sera´ de -R$ 0.50. Isso faz sentido? 23 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Enta˜o, para que a soluc¸a˜o geral seja realmente consistente, devemos levar em considerac¸a˜o as seguintes condic¸o˜es:• Que o valor pago pelas canetas seja sempre maior que o troco recebido (Z > Y ) • Que o valor pago e a quantidade de canetas seja sempre maiores que zero (Z > 0 e N > 0) • Que o troco seja maior ou igual a zero (Y ≥ 0) 24 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Se essas condic¸o˜es na˜o forem todas verdadeiras, enta˜o, o algoritmo deve terminar sinalizando, de alguma forma, a raza˜o de seu fracasso. INICIO Ler os valores de N, Y e Z Se Z > Y e N > 0 e Y ≥ 0 e Z > 0 Ent~ao Subtrair Y de Z e dividir o resultado por N Mostrar o resultado final Sen~ao Exibir a mensagem: "Erro: os valores s~ao inconsistentes" Fim Se FIM 25 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Lo´gica em Programac¸a˜o • Lo´gica e´ uma a´rea da Matema´tica cujo objetivo e´ investigar a veracidade de suas proposic¸o˜es • Considere, por exemplo, o caso em que temos as seguintes proposic¸o˜es 1. Se estiver chovendo, eu pegarei meu guarda-chuva 2. Esta´ chovendo • O que se conclui dessas duas proposic¸o˜es? Parece que a conclusa˜o o´bvia e´: ”eu pegarei o meu guarda-chuva” • Essa conclusa˜o seguiu o fato de que existe uma implicac¸a˜o lo´gica na primeira proposic¸a˜o, a qual afirma que ”se estiver chovendo”implica ”eu pegarei o meu guarda-chuva”. Essa implicac¸a˜o age como uma ”regra”, que conduz a` deduc¸a˜o do fato 26 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Lo´gica em Programac¸a˜o • ...e se as proposic¸o˜es fossem: 1. Se estiver chovendo, eu pegarei o meu guarda-chuva 2. Eu peguei o meu guarda-chuva • O que se conclui? A conclusa˜o poderia ser: ”Na˜o se pode afirmar com precisa˜o que esta´ chovendo so´ porque voceˆ pegou seu guarda-chuva, mas e´ plaus´ıvel que esteja chovendo” • Esses dois exemplos fornecem uma ideia, embora simplificada, do que a lo´gica se preocupa em estudar • Toda lo´gica proposta tambe´m deve ser formalizada em elementos sinta´ticos (especificam como escrever suas proposic¸o˜es) e elementos semaˆnticos (avaliam o significado das proposic¸o˜es) 27 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Lo´gica em Programac¸a˜o • No caso da lo´gica cla´ssica, o resultado da avaliac¸a˜o de suas proposic¸o˜es pode ser somente um entre dois valores: VERDADEIRO ou FALSO O papel da lo´gica em programac¸a˜o O papel da lo´gica em programac¸a˜o esta´ relacionado com a correta sequeˆncia de ins- truc¸o˜es que devem ser definidas para que o programa atinja seu objetivo. Serve como instrumento para a verificac¸a˜o do programa escrito, provando se este esta´ correto ou na˜o. • Em um algoritmo em execuc¸a˜o, o valor das suas varia´veis a cada instante representa o seu estado. Com a execuc¸a˜o dessas instruc¸o˜es, esse estado vai sendo alterado • Um algoritmo correto e´ aquele que, a partir de um estado inicial de suas varia´veis, consegue, com a execuc¸a˜o de suas instruc¸o˜es, chegar a um estado final, no qual os valores das varia´veis esta˜o de acordo com a soluc¸a˜o esperada 28 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Processo de criac¸a˜o de um algoritmo ◦ Lo´gica em Programac¸a˜o • Voltando ao algoritmo geral para a soluc¸a˜o do problema das canetas, podemos conferir sua soluc¸a˜o analisando a lo´gica empregada em cada passo: Ler os valores de N, Y e Z → Nesse ponto temos treˆs valores quaisquer de N, Y e Z Se Z > Y e N > 0 e Y ≥ 0 e Z > 0 Ent~ao → Nesse ponto, garante-se que Z > Y, N > 0, Y ≥ 0 e Z > 0 Subtrair Y de Z e dividir o resultado por N → Como Z > Y, Y ≥ 0 e Z > 0 enta˜o Z - Y > 0 e sendo N > 0, o resultado existe e e´ maior que zero Mostrar o resultado final→ E´ exibido o resultado, que existe e e´ maior que zero Sen~ao Exibir a mensagem: "Erro: os valores s~ao inconsistentes"→ Esse comando e´ executado quando, pelo menos, uma das condic¸o˜es do problema na˜o foi atendida. Fim Se 29 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Estruturac¸a˜o de algoritmos ◦ Grac¸as ao surgimento das linguagens de programac¸a˜o de alto n´ıvel2, as linguagens de programac¸a˜o se afastaram da linguagem de ma´quina e se aproximaram da ”lo´gica humana”. Cuidado Diferentemente da linguagem natural, a linguagem de programac¸a˜o e´ dirigida a orientar uma ma´quina e na˜o pessoas. Ma´quinas na˜o podem tomar deciso˜es com base em premissas. Ma´quinas na˜o podem escolher alternativas, mesmo que estas parec¸am o´bvias a um ser humano. Ma´quinas na˜o podem corrigir comandos mal redigidos. Ma´quinas na˜o podem descobrir a intenc¸a˜o do programador, mesmo que ela seja (ou pelo menos parec¸a) clara no contexto. 2 As linguagens de alto n´ıvel sa˜o independentes do processador em que sera˜o executadas. Suas caracter´ısticas principais sa˜o que seu co´digo e´ mais elaborado, contemplando operac¸o˜es mais complexas e mais pro´ximas da ”lo´gica humana”. Para que possam ser processadas por um computador, os comandos da linguagem precisara˜o ser traduzidos para a linguagem de ma´quina. Essa traduc¸a˜o e´ feita por meio de um compilador ou de um interpretador. 30 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Estruturac¸a˜o de algoritmos ◦ Por isso, a linguagem de programac¸a˜o precisa ter algumas caracter´ısticas que a linguagem natural na˜o tem. Veja-as a seguir: • Rigidez sinta´tica: O compilador e´ um tradutor relativamente limitado, que so´ consegue fazer as traduc¸o˜es sobre um idioma bastante limitado, com construc¸o˜es muito bem definidas. Apesar de encontrarmos palavras pertencentes a` linguagem natural, elas na˜o sera˜o usadas com a mesma liberdade • Rigidez semaˆntica: o computador definitivamente na˜o pode lidar com ambiguidades. Por isso na˜o adianta o programador ter uma intenc¸a˜o se na˜o conseguir exprimi-la de forma exata. Podemos dizer que o computador e´ um o´timo cumpridor de ordens, pore´m na˜o tem ide´ia de quais ordens esta´ cumprindo, nem o contexto em que essas ac¸o˜es esta˜o inseridas. Diferentemente da linguagem de programac¸a˜o, a linguagem natural apresenta ambiguidades. Por exemplo, considere a seguinte afirmac¸a˜o: A crianc¸a ouviu o barulho da janela 31 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Estruturac¸a˜o de algoritmos A crianc¸a ouviu o barulho da janela ◦ Essa afirmac¸a˜o curta pode ser interpretada de pelo menos treˆs maneiras: • A crianc¸a ouviu o barulho produzido pela janela • A crianc¸a estava junto a` janela e ouviu o barulho • A crianc¸a ouviu o barulho que veio atrave´s da janela ◦ Uma ma´quina seria incapaz de interpretar o que realmente esta´ acontecendo, mesmo que o contexto pudesse ajudar. Por isso, a rigidez semaˆntica e´ ta˜o crucial e consequentemente a linguagem natural na˜o pode ser utilizada como ferramenta para a construc¸a˜o de algoritmos computacionais ◦ A segunda alternativa seria escrever o algoritmo diretamente na linguagem de programac¸a˜o. Pore´m a rigidez sinta´tica e semaˆntica tornam a escrita de algoritmos uma tarefa bastante dif´ıcil, pois as pessoas na˜o esta˜o acostumadas a essas exigeˆncias para expressar ordens. Muitas vezes, mesmo em linguagem natural, esta na˜o e´ uma tarefa trivial.32 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Estruturac¸a˜o de algoritmos Dilema Chegamos a um dilema: a linguagem natural na˜o e´ adequada porque na˜o tem rigidez sinta´tica e semaˆntica e a linguagem de programac¸a˜o na˜o e´ ade- quada justamente por ter essas caracter´ısticas. Parece claro que devemos encontrar uma terceira alternativa para estruturar algoritmos computaci- onais. ◦ Na realidade, ja´ existem algumas alternativas. Duas delas sera˜o abordadas mais adiante: o fluxograma e o pseudoco´digo ◦ Independentemente da estrutura, e´ importante formalizar a descric¸a˜o do algoritmo segundo alguma convenc¸a˜o,para que todos possam entendeˆ-lo da mesma forma 33 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Em primeiro lugar, e´ necessa´rio definir um conjunto de regras que regulem a escrita do algoritmo, isto e´, regras de sintaxe ◦ Em segundo, e´ preciso estabelecer as regras que permitam interpretar um algoritmo, que sa˜o as regras semaˆnticas ◦ A sintaxe de um algoritmo resume-se nas regras para escreveˆ-lo corretamente ◦ Em computac¸a˜o, as regras indicam quais sa˜o os tipos de comandos que podem ser utilizados e tambe´m como neles escrever expresso˜es ◦ As expresso˜es de um comando em um algoritmo realizam algum tipo de operac¸a˜o com os dados envolvidos, isto e´, operam com valores e resultam em outros valores que sa˜o usados pelo algoritmo 34 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Os tipos de comandos de um algoritmo sa˜o tambe´m denominados estruturas de programac¸a˜o. ◦ Existem apenas treˆs tipos de estruturas que podem ser utilizadas para escrever qualquer programa: • Estruturas sequenciais • Estruturas de decisa˜o • Estruturas de repetic¸a˜o (lac¸os ou loops) 35 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial A Torre de Hano´i e´ um quebra-cabec¸a que consiste em uma base com 3 a 5 pinos, em um dos quais sa˜o dispostos alguns discos empilhados de baixo para cima por tamanho decrescente. O desafio consiste em transferir todos os discos de um pino para outro qualquer, sob as restric¸o˜es de que apenas um disco e´ movido de cada vez, e em momento algum um disco maior pode ser colocado sobre um disco menor. Um terceiro pino esta´ dispon´ıvel para apoiar os discos temporariamente. 36 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial ◦ Vamos supor que voceˆ tenha o seguinte problema: Inicialmente teˆm-se 3 pinos, A, B e C, e no pino A repousam treˆs discos de diaˆmetros diferentes, em ordem decrescente por diaˆmetro. Deseja-se transferir os 3 discos do pino A para o pino C, usando o pino B como pino auxiliar. Queremos desenvolver um algoritmo que gere a sequeˆncia exata de transfereˆncias de pino, disco a disco 37 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial As u´nicas informac¸o˜es para resolver esse problema sa˜o os estados inicial e final dos discos e as regras de movimento. Uma soluc¸a˜o poderia ser a seguinte sequencia de movimentos Um poss´ıvel algoritmo para resolver o problema das Torres de Hanoi com 3 discos INICIO 1. Mover disco 1 do pino A para o pino C 2. Mover disco 2 do pino A para o pino B 3. Mover disco 1 do pino C para o pino B 4. Mover disco 3 do pino A para o pino C 5. Mover disco 1 do pino B para o pino A 6. Mover disco 2 do pino B para o pino C 7. Mover disco 1 do pino A para o pino C FIM 38 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial Um poss´ıvel algoritmo para resolver o problema das Torres de Hanoi com 3 discos INICIO 1. Mover disco 1 do pino A para o pino C 2. Mover disco 2 do pino A para o pino B 3. Mover disco 1 do pino C para o pino B 4. Mover disco 3 do pino A para o pino C 5. Mover disco 1 do pino B para o pino A 6. Mover disco 2 do pino B para o pino C 7. Mover disco 1 do pino A para o pino C FIM O algoritmo acima e´ um bom exemplo de estrutura sequencial, pois sua execuc¸a˜o e´ direta, imperativa, na˜o havendo nenhum tipo de condic¸a˜o a ser verificada e nenhum desvio em seu caminho 39 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial Agora, considere o seguinte problema: Inicialmente teˆm-se 3 pinos, A, B e C, e no pino A repousam QUA- TRO discos de diaˆmetros diferentes, em ordem decrescente por diaˆmetro. Deseja-se transferir os 4 discos do pino A para o pino C, usando o pino B como pino auxiliar. Queremos de- senvolver um algoritmo que gere a sequeˆncia exata de transfereˆncias de pino, disco a disco 40 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial Um poss´ıvel algoritmo para resolver o problema das Torres de Hanoi com 4 discos INICIO 1. Mover disco 1 do pino A para o pino B 2. Mover disco 2 do pino A para o pino C 3. Mover disco 1 do pino B para o pino C 4. Mover disco 3 do pino A para o pino B 5. Mover disco 1 do pino C para o pino A 6. Mover disco 2 do pino C para o pino B 7. Mover disco 1 do pino A para o pino B 8. Mover disco 4 do pino A para o pino C 9. Mover disco 1 do pino B para o pino C 10. Mover disco 2 do pino B para o pino A 11. Mover disco 1 do pino C para o pino A 12. Mover disco 3 do pino B para o pino C 13. Mover disco 1 do pino A para o pino B 14. Mover disco 2 do pino A para o pino C 15. Mover disco 1 do pino B para o pino C FIM 41 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial Como essas soluc¸o˜es foram obtidas? • Primeiro, e´ importante entender o enunciado do problema e as regras que foram impostas. Dessa forma, na˜o e´ poss´ıvel especificar os movimentos nos quais uma pec¸a que esteja abaixo de outra seja movida e nem mover mais de uma pec¸a por vez • Segundo, e´ importante verificar a cada passo definido se a soluc¸a˜o esta´ se aproximando do objetivo final • Terceiro, o nu´mero de movimentos dobra cada vez que se acrescenta uma nova pec¸a. Portanto, a generalizac¸a˜o desse algoritmo, na forma em que esta´ sendo descrito, e´ impratica´vel para grandes valores de n (nu´mero de discos) 42 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Estrutura Sequencial Por exemplo: Se n for igual a 64 discos, o nu´mero de movimentos que devera˜o ser descritos sera´ igual a, aproximadamente, 2, 0 × 1019, ou seja, e´ humanamente imposs´ıvel listar todos os movimentos para resolver o problema • E´ poss´ıvel mostrar por Progressa˜o Geome´trica (e tambe´m pelo Princ´ıpio da Induc¸a˜o) que existe uma relac¸a˜o matema´tica entre o nu´mero de discos do problema (n) com o nu´mero mı´nimo de movimentos executados (m). Esta relac¸a˜o e´ dada pela seguinte fo´rmula: m(n) = 2n − 1 • Enta˜o, surge a seguinte pergunta: ... e se for considerado o mesmo problema, pore´m, com n discos postados inicialmente na haste A, como desenvolver um algoritmo que gere a sequeˆncia exata de transfereˆncias de pino, disco a disco? 43 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Modularizac¸a˜o / Recursa˜o • Se tive´ssemos que resolver esse problema com a ajuda de me´todos convencionais, ficar´ıamos preso na administrac¸a˜o dos discos rapidamente. Em vez disso, se atacarmos o problema com a recursa˜o em mente, o problema imediatamente se tornara´ mais resolu´vel. • Mover n discos pode ser visto em termos de mover apenas n− 1 (e da´ı a recursa˜o) discos da seguinte forma: Mova n−1 discos do pino A para o pino B, usando o pino C como a´rea de manutenc¸a˜o tempora´ria Mova o u´ltimo disco (o maior) do pino A para o pino C Mova os n−1 discos do pino B para o pino C, usando o pino A como a´rea de manutenc¸a˜o tempora´ria 44 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo ◦ Exemplo 1: Torre de Hano´i - Modularizac¸a˜o / Recursa˜o 1. Mova n−1 discos do pino A para o pino B, usando o pino C como a´rea demanutenc¸a˜o tempora´ria 2. Mova o u´ltimo disco (o maior) do pino A para o pino C 3. Mova os n − 1 discos do pino B para o pino C, usando o pino A como a´rea de manutenc¸a˜o tempora´ria • Essa soluc¸a˜o funciona para qualquer valor de n tal que n ≥ 1. Apesar de ser um algoritmo geral que resolve todos os casos para o problema das Torres de Hano´i, ainda existem algumas dificuldades nas sua forma de descric¸a˜o: i) Existe um tratamento informal dos comandos: por exemplo, o computador na˜o entende o significado da palavra mova ii) As operac¸o˜es descritas sa˜o u´teis para uma pessoa interpretar, mas na˜o para um ma´quina. E´ necessa´rio modelar melhor o problema de forma que seja facilmente traduzido para uma ma´quina 45 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Fluxogramas Definic¸a˜o Fluxograma: Inform. (fluxo+grama). 1. Diagrama para representac¸a˜o de um algo- ritmo. 2. Representac¸a˜o gra´fica, por s´ımbolos especiais, da definic¸a˜o, ana´lise ou me´todo de soluc¸a˜o de um problema ◦ Os fluxogramas apresentam os algoritmos de forma gra´fica. Sa˜o formados por s´ımbolos gra´ficos que conteˆm as instruc¸o˜es a serem executadas. Tais s´ımbolos gra´ficos sa˜o ligados por setas que indicam o fluxo das ac¸o˜es ◦ Todo fluxograma deve possuir uma sintaxe e uma semaˆntica bem-definidas. A sintaxe de um fluxograma e´ definida pela forma correta de empregar seus elementos, os quais sa˜o: • s´ımbolos gra´ficos espec´ıficos; • expresso˜es admiss´ıveis a serem escritas no interior dos s´ımbolos; • sub-rotinas predefinidas que podem ser utilizadas nas expresso˜es 46 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Fluxogramas S´ımbolo Uso Terminador Representa a sa´ıda para ou a entrada do ambiente externo, por exemplo, in´ıcio ou fim do programa Processo Representa a execuc¸a˜o de uma operac¸a˜o que resulta na mu- danc¸a de valor, forma ou localizac¸a˜o de uma informac¸a˜o ou valor Entrada/Saı´da Representa os dados, tanto de entrada como de sa´ıda, qual- quer que seja o meio utilizado Decis~ao Representa uma decisa˜o ou um desvio tendo uma entrada; pore´m pode ter uma se´rie de sa´ıdas alternativas, uma u´nica das quais devera´ ser ativada como consequeˆncia da avaliac¸a˜o das condic¸o˜es internas do s´ımbolo. O resultado apropriado de cada sa´ıda devera´ ser escrito adjacente a` linha, representando o caminho respectivo. 47 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Fluxogramas ◦ Os fluxogramas possuem um grande apelo visual e aplicac¸a˜o no entendimento de processos industriais, os quais sa˜o muito importantes na formac¸a˜o e na vida pra´tica do engenheiro ◦ De fato, a representac¸a˜o de algoritmos por meio de fluxogramas tem uma se´rie de vantagens como, por exemplo, a facilidade proporcionada para a compreensa˜o do funcionamento do algoritmo, mesmo para leigos ◦ Entretanto, a representac¸a˜o gra´fica na˜o e´ pra´tica por uma se´rie de razo˜es, dentre as quais podemos destacar duas: • A correc¸a˜o de uma linha de pensamento pode implicar a reconstruc¸a˜o de muitas instruc¸o˜es • A construc¸a˜o de algoritmos mais complexos e longos pode se tornar extremamente trabalhosa, ocupando va´rias pa´ginas 48 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Fluxogramas Essas caracter´ısticas acabam tornando a utilizac¸a˜o do fluxograma desaconselha´vel como ferramenta principal para o desenvolvimento de algoritmos. Todavia, a utilizac¸a˜o de fluxograma continua sendo u´til para apresentac¸a˜o de algoritmos em um n´ıvel de abstrac¸a˜o alto, sem entrar nos detalhes de sua implementac¸a˜o inicio ler num1, num2 num1 > num2 maior ← num1 maior ← num2 escrever maior fim sim na˜o 49 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Pseudoco´digo ◦ Algoritmos podem ser representados em co´digo diretamente em linguagem de programac¸a˜o. ◦ E´ fato que temos algumas vantagens como o co´digo pronto para a execuc¸a˜o e, o mais importante, a rigidez sinta´tica e a rigidez semaˆntica, que sa˜o imprescind´ıveis para que o algoritmo possa ser lido e executado pelo computador ◦ Contudo, a implementac¸a˜o de algoritmos diretamente em uma linguagem de programac¸a˜o apresenta uma se´rie de desvantagens. ◦ O pseudoco´digo visa a trazer o ma´ximo poss´ıvel desses benef´ıcios, tentando diminuir o oˆnus da utilizac¸a˜o da linguagem de programac¸a˜o. Abre-se ma˜o do co´digo compila´vel para se ter um co´digo menos r´ıgido, menos dependente das peculiaridades que todo compilador tem 50 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Pseudoco´digo ◦ Ao contra´rio da linguagem de programac¸a˜o, o pseudoco´digo tem um grau de rigidez sinta´tica intermedia´ria entre as linguagens natural e de programac¸a˜o. Ale´m disso, podemos utilizar o idioma nativo. Em geral, linguagens de programac¸a˜o sa˜o constru´ıdas utilizando palavras reservadas em ingleˆs, uma espe´cie de padra˜o de mercado ◦ Pore´m, o pseudoco´digo deve manter, tanto quanto poss´ıvel, a rigidez semaˆntica. A ideia e´ que o pseudoco´digo seja um passo intermedia´rio entre a linguagem natural e a linguagem de programac¸a˜o de alto n´ıvel ◦ Apo´s a construc¸a˜o do algoritmo em pseudoco´digo, e´ necessa´rio que mais um passo seja executado: a transformac¸a˜o do pseudoco´digo em co´digo de alguma linguagem de programac¸a˜o ◦ O pseudoco´digo e´ independente do compilador e pode ser traduzido de uma forma quase direta para uma gama de linguagens de programac¸a˜o 51 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Formalizac¸a˜o de um algoritmo: Pseudoco´digo ◦ Pseudoco´digo referente ao fluxograma mostrado no slide 49 inicio ler num1, num2 num1 > num2 maior ← num1 maior ← num2 escrever maior fim sim na˜o Algoritmo 1: Maior nu´mero Entrada: num1, num2 Sa´ıda: maior nu´mero 1 in´ıcio 2 declare num1, num2, maior: inteiro; 3 ler(num1,num2); 4 se num1 > num2 enta˜o 5 maior ← num1; 6 sena˜o 7 maior ← num2; 8 fim 9 escrever(”Maior numero = ”, maior); 10 fim 52 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ Em um computador, manipulamos informac¸o˜es que, durante a execuc¸a˜o de um programa, ficam armazenadas temporariamente na memo´ria ◦ Para que tais valores possam ser manipulados na linguagem de programac¸a˜o, e´ preciso que haja algum identificador informando em que local da memo´ria (enderec¸o) esse elemento se encontra ◦ Uma analogia u´til seria entender esta porc¸a˜o de memo´ria onde o elemento esta´ amrazenado como uma garagem que tenha uma placa de identificac¸a˜o na frente. Assim, supondo que tive´ssemos va´rios carros para escolher, encontrar´ıamos o que procuramos pela placa de identificac¸a˜o ◦ Varia´veis e constantes sa˜o reposito´rios de elementos pertencentes aos tipos. A diferenc¸a e´ que o elemento armazenado em uma constante e´ definido no in´ıcio do programa e na˜o e´ mais modificado, enquanto o da varia´vel pode ser alterado durante a execuc¸a˜o do programa 53 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ Tanto varia´veis como constantes teˆm algumas caracter´ısticas em comum: ambas sa˜o identificadas por um nome ◦ Podemos compreender varia´veis e constantes como as garagens por analogia. Os nomes devem identificar o objeto que ali esta´ guardado, pore´m na˜o ha´ garantia de que o objeto armazenado seja o esperado ◦ Digamos que se tentarmos colocar um Fusca na garagem em que se encontra a placa da Ferrari, conseguiremos. No entanto, quando quisermos dar uma volta de Ferrari, acessaremos a garagem da Ferrari e teremos uma surpresa ao nosdepararmos com o Fusca. ◦ Portanto, conve´m ao programador dar nomes significativos a`s varia´veis e constantes de acordo com os elementos (ou valores) que armazenara˜o. Normalmente, utilizamos mnemoˆnicos, ou seja, nomes ou abreviaturas que lembram o uso da varia´vel no algoritmo 54 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ As varia´veis em um algoritmo devem ser escritas de modo claro, intelig´ıvel. Nesse sentido, convencionam-se algumas regras para nomear varia´veis: • O nome de uma varia´vel pode ser constitu´ıdo por letras do alfabeto (minu´sculas e maiu´sculas), d´ıgito (0,. . . 9) e ainda pelo caracter underscore( ). Cuidado 1 Evite identificadores que comecem por sublinhado ( ) simples ou duplo, porque aqueles gerados pelo compilador e os da biblioteca-padra˜o podem usar nomes semelhantes Cuidado 2 O primeiro caracter na˜o pode ser um d´ıgito. O primeiro caracter deve ser uma letra • Maiu´sculas e minu´sculas representam varia´veis distintas 55 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ As varia´veis em um algoritmo devem ser escritas de modo claro, intelig´ıvel. Nesse sentido, convencionam-se algumas regras para nomear varia´veis: Boa pra´tica de programac¸a˜o E´ tradic¸a˜o usar minu´sculas para nomes de varia´veis e maiu´sculas para nomes de cons- tantes. Isso facilita na hora da leitura do co´digo • Letras fora do alfabeto ocidental, como as letras gregas, na˜o sa˜o aceitas Boa pra´tica de programac¸a˜o A escolha de nomes significativos de varia´veis favorecera´ a elaborac¸a˜o de um programa ”autodocumentado”, isto e´, que necessitara´ de menos comenta´rios 56 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ Antes de utilizarmos uma varia´vel dentro de uma algoritmo, e´ necessa´rio definir o tipo de valor que essa varia´vel pode armazernar e identifica´-la com o nome pelo qual sera´ acessada ◦ Uma varia´vel de um determinado tipo so´ pode receber valores que pertenc¸am a`quele tipo. Na analogia das garagens, podemos dizer que uma garagem de carro so´ pode armazenar Fuscas, Ferraris e outros carros, pore´m na˜o podem armazernar avio˜es ◦ A declarac¸a˜o de uma varia´vel em um algoritmo, segundo a nossa notac¸a˜o, e´ feita da seguinte forma: declare <varia´veis> : tipo 57 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para tipos de dados: Constantes e varia´veis ◦ Os principais tipos de dados sa˜o: • inteiro: qualquer nu´mero inteiro, negativo, nulo, ou positivo. Exemplo: -15; 0; 104 • real: qualquer nu´mero real, negativo, nulo ou positivo. Exemplo: -1.0; -0.5; 0.0; 5.0; 9.3 • caracter: qualquer conjunto de caracteres alfanume´ricos. Exemplo: ”AB”; ”123”; ”A123”; ”prova” • lo´gico: falso ou verdadeiro (operador booleano) Valores lo´gicos Os valores lo´gicos ou ainda booleanos (em homenagem a George Boole, que elabo- rou a lo´gica booleana) sa˜o aqueles que representam apenas dois estados: um estado verdadeiro ou um estado falso. 58 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para as expresso˜es: Atribuic¸a˜o ◦ Ja´ descrevemos onde os dados ficam armazenados, pore´m para que possamos manipula´-los e´ necessa´rio primeiramente colocar um valor dentro da varia´vel ◦ A atribuic¸a˜o e´ a operac¸a˜o que permite armazenar um valor em uma varia´vel e e´ representada pelo s´ımbolo ← (seta para a esquerda) ◦ A atribuic¸a˜o e´ feita das seguintes formas: <varia´vel> ← <valor> ou <varia´vel> ← <resultado de uma expressa˜o> 59 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para as expresso˜es: Atribuic¸a˜o ◦ Exemplos: 1. altura ← 1.80 (armazenar o valor 1.80 na varia´vel altura, ou ainda altura recebe 1.80) 2. A ← 6 (armazenar o valor 6 na varia´vel A, ou ainda A recebe 6) 3. A ← A + 1 (A recebe o valor de A + 1) Observac¸a˜o Apenas valores pertencentes ao tipo da varia´vel podem lhe ser atribu´ıdos (p. ex. uma varia´vel do tipo inteiro so´ pode receber valores do tipo inteiro 60 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para as expresso˜es: Operac¸o˜es aritme´ticas ◦ Em programac¸a˜o, todas as quatro operac¸o˜es aritme´ticas ba´sicas (adic¸a˜o, subtrac¸a˜o, multiplicac¸a˜o e divisa˜o) sa˜o suportadas ◦ Essas operac¸o˜es matema´ticas sa˜o consideradas operac¸o˜es bina´rias, pois envolvem sempre dois operandos ◦ Ja´ a operac¸a˜o troca de sinal e´ una´ria, pois altera o sinal de um u´nico operando. O operador una´rio pode ser pensado como uma operac¸a˜o que multiplica seu operador por -1 • Exemplos: 1. x← −x 2. y ← −b 61 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para as expresso˜es: Operac¸o˜es aritme´ticas ◦ Dependendo dos operadores e do tipo de resultado, a divisa˜o pode ser feita de forma diferente: a divisa˜o real (operador /), a divisa˜o inteira (operador div) e o resto da divisa˜o inteira (operador mod) ◦ Exemplos: 1. resp ← 14 div 3 (divisa˜o inteira: resp recebe 4) 2. resp ← 14 mod 3 (resto da divisa˜o inteira: resp recebe 2) 3. resp ← 14.0/3.0 (divisa˜o real: resp recebe 4.67) ◦ Um resumo das operac¸o˜es aritme´ticas e´ apresentado na tabela a seguir. 62 / 63 Algoritmos e Lo´gica de Programac¸a˜o • Convenc¸o˜es para as expresso˜es: Operac¸o˜es aritme´ticas Operac¸ao 1o operando 2o operando Tipo resultante Simbologia Adic¸a˜o inteiro inteiro inteiro z ← x + yreal real real real inteiro real inteiro real real Subtrac¸a˜o inteiro inteiro inteiro z ← x− yreal real real real inteiro real inteiro real real Multiplicac¸a˜o inteiro inteiro inteiro z ← x ∗ yreal real real real inteiro real inteiro real real Divisa˜o real inteiro inteiro real z ← x/yreal real real real inteiro real inteiro real real Divisa˜o inteira inteiro inteiro inteiro z ← x div y Resto inteiro inteiro inteiro z ← x mod y Troca de sinal inteiro Na˜o aplica´vel inteiro z ← −x real Na˜o aplica´vel real 63 / 63
Compartilhar