Baixe o app para aproveitar ainda mais
Prévia do material em texto
Disciplina: Informática para Engenharia Aula 4: Estrutura Sequencial Apresentação Um dos maiores obstáculos no desenvolvimento de algoritmos está relacionado à transcrição do que se propõe a resolver para um código que a máquina vá entender. Sabemos que problemas de Engenharia não são simples, tornando a tarefa de programar ainda mais difícil; além disso, é recorrente a manipulação de diversas estruturas de dados, como números de alta precisão, textos, datas e horas. Equações e inequações matemáticas – presentes em disciplinas como Álgebra, Cálculo e Física, entre outras – são constantes durante boa parte dos cursos de Engenharia. Não seria útil se tivéssemos códigos já prontos para esses problemas comuns? Algo já desenvolvido e que resolvesse problemas trigonométricos, logarítmicos, de potenciação, entre outros? Pois saiba que tais funções já existem e são encontradas em bibliotecas! Os códigos desta aula serão apresentados de acordo como executamos no terminal. No entanto, fique à vontade para utilizá-los na IDE Spyder. Objetivos Programar algoritmos lidando com estruturas e dados com maior complexidade; Construir programas a partir das principais bibliotecas disponíveis na linguagem. Programação Estruturada O maior problema em grandes sistemas de software reside na enorme complexidade desses sistemas, cuja apreensão vai geralmente muito além da capacidade intelectual de um ser humano. Entenda-se aqui por complexidade de um sistema uma medida do número de seus componentes e do grau de interação entre eles. Para Dijkstra, a arte de programar consiste na arte de organizar e dominar a complexidade. (Fonte: agsandrew / Shutterstock) Essa complexidade em programação está comumente relacionada aos diversos formatos de instruções, de dados disponíveis, bem como aos métodos para manipulá-los já embutidos na linguagem. Na manipulação com valores numéricos, gostaríamos de realizar tarefas como arredondamento, além de cálculos com números precisos de uma maneira fácil, não é? Seria muito bom também tratar de textos, como conversão para caixa-alta ou caixa-baixa, de uma maneira simples e rápida, sem contar o uso de datas e horas em algumas situações. Strings e Textos Quase todo programa útil envolve algum tipo de processamento de texto, seja analisando dados, seja gerando saída. Esta seção tem como foco problemas comuns que envolvem a manipulação de texto, como separar strings, substituir e verificar letras maiúsculas/minúsculas. Muitas dessas tarefas podem ser facilmente resolvidas usando-se métodos embutidos de strings. Separando Strings Imagine a situação em que é informado o nome completo de uma pessoa, mas, na verdade, você queria o primeiro e o segundo nome separados. Como resolvemos esse problema sem alterar drasticamente a estrutura do programa? Exemplo Podemos dividir a string ppr meio da função split()! Por exemplo, para dividir o texto “Olá Mundo ” através do comando “Olá Mundo ”.split(‘’). As aspas dentro dos parênteses indicam que o critério de divisão será o espaço entre as palavras da string. Voltando ao nosso problema... >>> nome = “sao paulo” >>> primeiro_nome=nome.split(‘ ‘)[0] >>> print(primeiro_nome) sao >>> segundo_nome=nome.split(‘ ‘)[1] paulo O que o comado split() fez foi justamente dividir o texto em dois termos para um vetor. Temos de indicar a posição de cada elemento para a respectiva variável. Note que a primeira posição é zero, conforme pode ser observado no exemplo. Substituindo Caracteres e Palavras Podemos observar a falta do acento na palavra ‘sao’. Imagine a ocorrência desse erro em diversos textos de um algoritmo. Não seria interessante ter um método que substituísse o ‘sao’ pelo ‘são’? Apresentamos o replace()! >>> nome.replace(‘sao’,são’) são paulo Tratando Letras Maiúsculas e Minúsculas Ainda assim, percebemos um erro relacionado com as primeiras letras (nome próprio). Podemos ajustar esse problema com o comando title()! >>> print(nome.title()) são paulo Demais operações referentes à alteração de caracteres maiúsculos/minúsculos envolvem a transformação de todos os caracteres para caixa-alta (upper()), caixa-baixa (lower()) e primeira letra em maiúsculo (capitalize()). >>> print(nome.upper()) SÃO PAULO >>> print(nome.lower()) são paulo >>> print(nome.capitalize()) São paulo Métodos Booleanos O Python possui alguns métodos de string que serão avaliados em um valor booleano. Esses métodos são úteis quando estamos criando formulários para os usuários preencherem, por exemplo. Se estivermos solicitando um cep, desejaremos aceitar apenas uma string numérica, mas, quando solicitarmos um nome, desejaremos aceitar apenas uma string alfabética. Método Verdadeiro se... str.isalnum() a string consiste em apenas caracteres alfanuméricos (sem símbolos). str.isalpha() a string consiste em apenas caracteres alfabéticos (sem símbolos). str.islower() os caracteres alfabéticos da string são todos minúsculos. str.isnumeric() a string consiste em apenas caracteres numéricos. str.isspace () a string consiste em apenas caracteres de espaço em branco. str.istitle () a string está com caracteres iniciais em maiúsculo. str.isupper () os caracteres alfabéticos da string são todos maiúsculos. Exemplo Por exemplo, observe o uso da função para verificar se o caracter é numérico. >>> numero = “5” >>> letras = “abcdef” >>> print(numero.isnumeric()) True >>> print(letras.isnumeric()) False Números, Datas e Horas Realizar cálculos matemáticos com números inteiros e de ponto flutuante é fácil em Python. No entanto, se você precisar executar cálculos com números complexos, ou datas e horas, será necessário um pouco mais de trabalho. O foco desta seção é sobre esses tópicos. Arredondando Valores Numéricos Considere que você deseja arredondar um número de ponto flutuante para um número fixo de casas decimais. Para um arredondamento simples, use a função round(valor, ndigits). Por exemplo: #arredondar o número para 1 casa decimal >>> round(5.67, 1) 5.7 >>> round(10.9568, 2) 10.96 Atenção Não confunda o arredondamento com a formatação de um valor para saída. Se o seu objetivo é simplesmente saída de um valor numérico com determinado número de casas decimais, você normalmente não precisa usar round(). Em vez disso, basta especificar a precisão desejada ao formatar. Realizando Cálculos Decimais Precisos Imagine que você necessita realizar cálculos precisos com números decimais e que pequenos erros não podem ser tolerados. Um problema bem conhecido com os números de ponto flutuante é que eles não podem representar com precisão todas as decimais da base 10. Além disso, até mesmo cálculos matemáticos simples introduzem pequenos erros. Por exemplo: Exemplo >>> x = 4.2 >>> y = 2.1 >>> x + y 6.300000000000001 >>> (x + y) == 6.3 False Se você quer mais precisão (e está disposto a desistir de algum desempenho), pode usar o módulo decimal: >>> from decimal import Decimal >>> x = Decimal('4.2') >>> y = Decimal('2.1') >>> x + y Decimal('6.3') >>> print(x + y) 6.3 >>> (x + y) == Decimal('6.3') True Trabalhando com Frações O módulo de frações (fractions) pode ser usado para realizar cálculos matemáticos envolvendo frações. Por exemplo: # Simples operação com fração >>> from fractions import Fraction >>> a = Fraction(5, 4) >>> b = Fraction(7, 16) >>> print(a + b) 27/16 >>> print(a * b) 35/64 # Obtendo numerador/denominador >>> c = a * b >>> c.numerator >>> c.denominator >>> # Convertendo um float para uma fração >>> x = 3.75 >>> y = Fraction(*x.as_integer_ratio()) >>> y Fraction(15, 4) Executando Cálculos com Números Complexos Número complexo é a combinação de um número real com um número imaginário. Os números imaginários existem, por exemplo, em uma equação diferencial, com coeficientes como a, b e c na fórmula quadrática, que modela como os circuitos elétricos ou os sistemas de mola/amortecedor se comportam. Por exemplo: Números complexos podem ser especificados usando-se a funçãocomplexa (real, imag) ou números de ponto flutuante com um sufixo j. Por exemplo: >>> a = complex(2, 4) >>> b = 3 - 5j >>> a (2+4j) >>> b (3-5j) Os valores reais, imaginários e conjugados são fáceis de serem obtidos, como mostrado aqui: >>> a.real 2.0 >>> a.imag 4.0 >>> a.conjugate() (2-4j) Trabalhando com Data e Hora Uma tarefa muito comum em programação é a necessidade de executar conversões de tempo simples (por exemplo, de dias para segundos, de horas para minutos, e assim por diante). Para realizar conversões e aritmética envolvendo diferentes unidades de tempo, use o módulo de data e hora. Por exemplo, para representar um intervalo de tempo, crie uma instância timedelta, como esta: >>> from datetime import timedelta >>> a = timedelta(days=2, hours=6) >>> b = timedelta(hours=4.5) >>> c = a + b >>> c.days 2 >>> c.seconds 37800 >>> c.seconds / 3600 10.5 >>> c.total_seconds() / 3600 58.5 Se você precisar representar datas e horas específicas, crie instâncias de data e hora e use as operações matemáticas que são padrão para manipulá-las. Por exemplo: Exemplo >>> from datetime import datetime >>> a = datetime(2018, 1, 1) >>> print(a + timedelta(days=10)) 2018-01-11 00:00:00 >>> b = datetime(2018, 2, 21) >>> d = b - a >>> d.days 51 >>> now = datetime.today() #Formatando a saída com a função strftime() >>> print(now.strftime('%d-%m-%Y')) #%d → dia; %m → mês; %Y → ano com 4 dígitos 2018-06-09 >>> print(now.strftime('%d-%m-%Y %H:%M:%S')) #%H → hora; M → minutos; S → segundos 2018-06-09 12:08:00 >>> print(now.strftime('%d-%m-%Y') + timedelta(minutes=10)) 2012-12-21 Dica Para a maioria dos problemas básicos de manipulação de data e hora, o módulo datetime será suficiente. Se você precisar executar manipulações de data mais complexas (como lidar com fusos horários, intervalos de tempo difusos, calcular as datas dos feriados e assim por diante), consulte o módulo dateutil. Bibliotecas De forma simplificada, as bibliotecas são componentes que oferecem funções e classes para nossos programas. Além das funções já incorporadas, o Python conta com uma extensa lista de bibliotecas para as mais variadas finalidades. Datetime Entre elas, já vimos a biblioteca para manipulação de data e hora – datetime. Math Outra importante biblioteca chama-se math, constituída de muitas funções úteis para programas que precisam executar operações matemáticas. Numpy, SciPy e Matplotlib Ainda podemos citar como bibliotecas essenciais o NumPy, para processamento de matrizes, sequências de caracteres, registros e objetos, a biblioteca científica para Python (o SciPy) e o pacote de plotagem Python, denominado matplotlib. A seguir, veremos as principais funções da biblioteca math utilizadas em computação científica. Para mais detalhes sobre todas as funções disponíveis em math, digite dir(math) no terminal. Funções que Envolvem Potências Muitas tarefas envolvem o cálculo de exponenciação (2 ), como o cálculo do volume de superfície e a área de um cilindro. Poderíamos inicialmente pensar em fazer 2*2*2, não é? Mas essa não é uma boa solução quando temos um expoente grande (tipo 10). Nesse caso, podemos usar a função pow disponível na biblioteca math. Sua sintaxe é pow(double x, double y). Ela recebe dois argumentos do tipo double: o primeiro é a base, e o segundo, o expoente, retornando o valor da base elevada ao expoente. Por exemplo: se quiséssemos saber o resultado da operação 2 , faríamos: # Esse tipo de importação torna obrigatória a # utilização do nome da biblioteca antes da função. >>> import math >>> print(math.pow(2,10)) 1024 # Não necessitamos utilizar a palavra math antes da # função >>> from math import pow >>> print(pow(2,10)) 1024 Existe outra forma de realizar a mesma operação, por meio do operador **. Nesse aso, o código para o exemplo seria 2 ** 10. Diversos problemas, como os que realizam cálculos de distância (euclideana por exemplo), utilizam radiciação. Uma maneira mais simples para se obter a raiz quadrada de um número seria elevá-lo a ½, ou seja, pow(36,½). Mas gostaríamos de uma maneira mais fácil para calcular outras raízes, não é? Essa função é a sqrt(double x), que retorna o valor da raiz quadrada, recebendo como argumento um double do qual ele deve extrair a raiz. 3 10 Exemplo >>> import math >>> print(math.sqrt(36)) 6.0 Funções Trigonométricas Muitos problemas geométricos envolvem o cálculo de senos, cossenos e tangentes. Imagine que nos foi pedido um programa que calcule a distância (em km) ao longo da Terra entre dois pares de latitude e longitude, além dos cálculos envolvendo triângulos. Isso envolveria o cálculo do seno, cosseno, tangente e hipotenusa. O cálculo do seno é obtido com a função double sin(double x) e recebe como argumento o valor dos graus em double. Já o cosseno é calculado por double cos(double x), que recebe como argumento o valor dos graus em double. A função tan(double x) retorna o valor da tangente, recebendo como argumento o valor dos graus em double. Todos os valores retornados são em radianos. Por exemplo, o código a seguir imprime as relações entre seno, cosseno e tangente para os graus de um triângulo. >>> import math >>> print('Graus Radianos Seno Cosseno Tangente') >>> print('------- ------- ------- -------- -------') >>> fmt = ' '.join(['%7.2f'] * 5) >>> for graus in range(0, 361, 30): >>> rad = math.radians(graus) >>> if deg in (90, 270): >>> t = float('inf') >>> else: >>> t = math.tan(rad) >>> print fmt % (graus, rad, math.sin(rad), math.cos(rad), t) Funções logarítmicas O Google dá a cada página da Web uma pontuação (o PageRank), que é uma medida aproximada de autoridade/importância. Essa é uma escala logarítmica, que, na minha cabeça, significa: "O PageRank conta o número de dígitos na sua pontuação". Assim, um site com 99 visitas tem um PageRank 2, considerado nesse caso 10x mais importante que outro site com PageRank 1. Assim, a classificação do PageRank de um dado número de visitas a um site pode ser obtida com a função logarítmica na base 10. >>> from math import log10 >>> site_a = 9999 >>> pagerank_a = log10(site_a) >>> print(pagerank_a) 3.9999565683801923 >>> pagerank_a.floor()+1 4 Para logaritmos na base e utilizamos log(double x), em que o x é o logaritmando. A função log() leva um segundo argumento opcional que permite que você especifique a base. Por exemplo, para calcular o Log de 8 na base 2, o comando é: >>> math.log(8,2). 3 Funções de Arredondamento Em certas situações, gostaríamos de arredondar valores ou simplesmente considerar a parte inteira. Imagine que você pudesse sugerir uma função para “arredondar” sua nota, que atualmente é 7.1, para 8. Essa função seria a ceil(double x). Ela retorna o primeiro float sem casas decimais acima, recebendo um float como argumento. Exemplo: math.ceil (45.98561) resultaria em 46. Suponha que seu algoritmo espere que o usuário informe um número inteiro. No entanto, foi digitado por engano um número real, por exemplo 10.2. Dica Como considerar somente a parte inteira desse número? Usando a função floor floor(double x)! Ela é responsável por retornar o primeiro float sem casas decimais abaixo, recebendo um float como argumento. Exemplo: math.floor (45.98561) resultaria em 45. Atividade 1. Escreva um programa em Python para calcular o volume da superfície e a área de um cilindro. Para isso, utilize a constante math.pi da biblioteca math. 2. Suponha que você esteja escrevendo um código que precise que o usuário informe seu nome e cpf. Ao final, você deverá imprimir o nome com as primeiras letras em maiúsculo, verificar se o cpf só possui números, sendo exibido no formato 999.999.999-99, e apresentar a data do cadastro no formato dd/mm/aaaa. 3. Analise as assertivas sobre as funções em Python: I. o resultado da expressão k = 2 + 3l é um número complexo. II. o resultado de round(0.5) – round(-0.5) é 2. III. considerando x = 8/3, o resultado de floor(Fraction(x)) é igual ao round(Fraction(x)).a) I e II. b) I e III. c) II e III. d) Todas estão corretas. e) Todas estão erradas. Referências GRUS, J. Data science from scratch: first principles with Python. Beijing: O’Reilly, 2015. MENEZES, N. N. C. Introdução à programação com Python: algoritmos e lógica de programação para iniciantes. 1. ed. São Paulo: Novatec, 2017. MUELLER, J. P. Começando a programar em Python para leigos. Alta Books, 2016. PERKOVIC, L. Introduction to computing using Python: an application development focus. 2. ed. [s.l.] Wiley Publishing, 2015. Próximos Passos Os benefícios da modularização de programas, conceituando blocos de código e escopo de variáveis; O uso das técnicas para modularização de programas. Explore mais Assista ao vídeo “Programação Estruturada usando Python <https://www.youtube.com/playlist?list=PLDE3A6A7013550874> ”. Assista ao vídeo “Programar em Python #26 – Data e Hora <https://www.youtube.com/watch?v=LMTefEElmNg> ”. Assista ao vídeo “11 - Python – Strings 02 – Métodos Aplicados a Strings <https://www.youtube.com/watch?v=D5ChMm-KR3Y> ”. Acesse a biblioteca math do Python <https://docs.python.org/3/library/math.html> .
Compartilhar