Você está na página 1de 14

Aula 10 - Estruturas de Dados, Classes e Objetos

Programação

Informática Web
João Cordeiro
jpcc@ubi.pt

Dezembro 14, 2022

Programação (Informática Web) Aula 10 Dezembro 14, 2022 1 / 16


Estruturas de Dados, Classes e Objetos

Sumário
Consolidação do estudo das estruturas de dados heterogéneas. Introdução
ao estudo da programação orientada a objetos. As noções de classe e objeto.
Operações com objetos. Exemplos e exercícios.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 2 / 16


Estruturas de Dados Heterogéneas

Definição
É uma estrutura que agrega dados de diferentes tipos.

+ Em Python, uma lista, um conjunto ou tuplo podem satisfazer os


critérios de definição anterior. No entanto estas estruturas são mais
usadas para agregar dados do mesmo tipo. Por exemplo, podemos ter
numa mesma lista números inteiros, floats e strings:
salada = [2, ’a’, -3.12, "UBI"].
+ Quando falamos de uma estrutura heterogénea estamos mais a pensar
em algo mais próximo de uma struct, em linguagem C. Portanto, um
tipo de dados que agrega elementos de diferentes tipos.
+ Motivação: Como é que podemos representar diferentes características
de uma estudante?

Programação (Informática Web) Aula 10 Dezembro 14, 2022 3 / 16


Estruturas de Dados Heterogéneas

Como representar diferentes características de uma estudante?

+ Por exemplo se quisermos representar somente o número, nome e média


actual das classificações, para depois trabalharmos com listas ou con-
juntos de estudantes, como é que podemos proceder, tendo em conta
o que sabemos até agora?
+ Aqui uma possibilidade seria usar tuplos, por exemplo:
design = [(107,’Anne’, 18.1), (108,’John’,17.3)]

+ O que será mostrado com print(1+design[1][2])?


+ No entanto, em situações do mundo real, temos frequentemente enti-
dades com muito mais que três características! Por exemplo, 5, 10, 20,
ou mais. Logo, esta representação não seria a mais adequada.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 4 / 16


Estruturas de Dados Heterogéneas

Podemos definir uma estrutura heterogénea como sendo uma classe de


dados e defini-la com uma notação simples da seguinte forma:
from dataclasses import dataclass

@dataclass
class Estudante :
numero : int
nome : str
media : float

Podemos agora criar variáveis do tipo desta nova classe, assim:


a = Estudante (107 , " Anne " , 18.1)
b = Estudante (108 , " John " , 17.3)

Programação (Informática Web) Aula 10 Dezembro 14, 2022 5 / 16


Estruturas de Dados Heterogéneas
No exemplo anterior, a e b são duas variáveis estruturadas da classe
Estudante, ou do tipo Estudante. Podemos aceder de forma individual
aos elementos de uma variável estruturada:
a = Estudante (107 , " Anne " , 18.1)
print ( " A % s tem % f de m é dia ! " % ( a . nome , a . media ) )
a . media = a . media - 0.11
print ( a )

Se L for a lista dos estudantes da turma de Design e quisermos uma


função que recebe esta lista e calcula a média das médias dos alunos,
podemos fazer assim:
def mediaTurma ( L : list ) :
soma = 0
for x in L :
soma = soma + x . media
return soma / len ( L )

Programação (Informática Web) Aula 10 Dezembro 14, 2022 6 / 16


Estruturas e Classes

Problema Estratégico – Primitivas Geométricas


Vamos supor que estamos interessados em criar um programa de desenho
gráfico para miúdos, de modo a que estes possam experimentar certos con-
ceitos de geometria elementar. Por simplicidade de exercício, vamos consid-
erar só a representação de cinco primitivas geométricas: o ponto, a recta,
o triângulo, o rectângulo e o círculo. Defina as estruturas necessárias para
representar estas quatro entidades. Depois, pense em funcionalidades rele-
vantes relacionadas com estas quatro primitivas de desenho.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 7 / 16


Estruturas e Classes

Queremos representar cinco primitivas gráficas:


+ Ponto: definido por duas coordenadas, portanto
dois números. Uma vez que a representação será
em pixeis, vamos usar duas variáveis do tipo int.
+ Recta: definida por dois pontos. Usamos duas
instâncias da primitiva anterior.
+ Rectângulo: definido por um ponto (e.g., canto
superior esquerdo) e duas grandezas adicionais, o
comprimento e a largura, em número de pixeis.
+ Triângulo: definido por três pontos. É semelhante
à definição da reta, mas com mais um ponto.
+ Círculo: definido por um ponto (o centro) e a
grandeza raio.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 8 / 16


Estruturas e Classes

@dataclass @dataclass
class Ponto : class Recta :
x : int a : Ponto
y : int b : Ponto

@dataclass @dataclass
class Rectangulo : class Triangulo :
origem : Ponto a : Ponto
compri : int b : Ponto
largur : int c : Ponto

@dataclass
class Circulo :
centro : Ponto
raio : int

Programação (Informática Web) Aula 10 Dezembro 14, 2022 9 / 16


Estruturas e Classes

Definição de funções relevantes:

+ Criação de objetos gráficos válidos;


+ Comprimento de uma reta;
+ Funções de perímetro: triângulo,
retângulo e circulo;
+ Funções de área: triângulo, retângulo e
circulo;
+ etc.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 10 / 16


Objeto = Estrutura + Função

Um objeto é portanto uma estrutura enriquecida com funcionalidades


próprias a essa mesma estrutura e que a permitem criar, validar,
operar, transformar, entre outras possibilidades.
Em Python um objeto é definido através de uma classe, tal como
uma estrutura.
Quando falamos de um objeto, falamos da instância de uma classe.
Podemos ter muitos objetos diferentes mas que não são mais que
instâncias de uma mesma classe.
As funções de um objeto designam-se por métodos.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 11 / 16


Objeto = Estrutura + Função

A primitiva Ponto:
from math import sqrt

class Ponto :
x : int
y : int

def __init__ ( self , x , y ) :


self . x = x
self . y = y

def distance ( self ) :


O método distance return sqrt ( self . x **2+ self . y **2)
devolve a distância a que
o ponto está da origem: a = Ponto (2 ,5)
coordenadas (0,0). print ( a . distance () )

Programação (Informática Web) Aula 10 Dezembro 14, 2022 12 / 16


Objeto = Estrutura + Função

Podem existir diversos A primitiva Circulo:


construtores, recebendo from math import PI
diferentes parâmetros.
Também podemos ter class Circulo :
diferentes versões do centro : Ponto
raio : int
mesmo método.
def __init__ ( self , c : Ponto , r : int ) :
self . centro = c
self . raio = r

def __init__ ( self , x , y , r ) :


self . centro = Ponto (x , y )
self . raio = r

...

Programação (Informática Web) Aula 10 Dezembro 14, 2022 13 / 16


Definição da "Stringificação" do Objeto

Frequentemente class Ponto :


podemos querer definir n =0
os detalhes da conversão x : int
y : int
de um objeto para string
(str). def __init__ ( self ,x , y ) :
Para tal usamos um self . x = x
self . y = y
método "magic names".
Neste caso será o @staticmethod
método __str__(). def reset () :
O que este método faz é Ponto . n = 0
definir a def __str__ ( self ) :
expressão/conversão do return f ’ ({ self . x } ,{ self . y }) ’
objeto em string.

Programação (Informática Web) Aula 10 Dezembro 14, 2022 16 / 16

Você também pode gostar