Você está na página 1de 18

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...


a string consiste em apenas caracteres alfanuméricos (sem
str.isalnum()
símbolos).
a string consiste em apenas caracteres alfabéticos (sem
str.isalpha()
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ção


complexa (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

>>> 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 (23), 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 210, 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.

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).

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> .

Você também pode gostar