Resumo APC2
Resumo APC2
Resumo APC2
a=3
O objeto int com valor 3 e o nome “a” são criados na memória. Python mantém em uma tabela as variáveis criadas ,
que apontam para objetos alocados na memória
a=6
➢ d = [2,3,5,8,11]
➢ d[3]=7
Dado o seguinte trecho de código em Python, considere S para as instruções que são válidas, e N para as que
não são válidas:
( ) lista[0] = 'x'
( ) lista[0][0] = 'x'
( ) lista[1][0] = 'x'
( ) lista[2][0] = 'x'
( ) lista[2][0][0] = 'x'
a) S-N-S-S-N
b) S-S-S-S-N
c) S-S-S-N-N
d) S-S-N-N-N
e) S-N-N-N-N
Resolução: Strings são imutáveis, então, quando tenta-se alterar um caractere dela, dá erro. Por exemplo, lista[0][0]
irá acessar o caractere ‘a’ da primeira string da lista. Já lista[0] acessa a string inteira, podendo esse ponteiro ser
alterado para outra string (no caso é o caractere x).
Classe: Descreve um conjunto de Objetos semelhantes, um grupo de atributos e métodos que resumem
características de um objeto. É uma abstração geral de um grupo de objetos específicos.
Na prática, definimos uma classe, e depois a instanciamos por meio da criação de um objeto.
Definindo uma classe:
Para definir classes em Python, usa-se o operador class, seguido do nome da classe e dois pontos. No bloco de
código associado à classe, pode-se declarar variáveis e funções. O código abaixo declara a classe MyClass com uma
variável e uma função interna, chamadas my_variable e my_func respectivamente.
Para criar um objeto (ou instância) da classe MyClass, usa-se a mesma sintaxe de chamada de funções:
Com isso, a variável my_object agora representa uma instância, i.e., um objeto, da classe MyClass.
Portanto, my_object tem acesso tanto à variável my_variable, quanto à função my_func, sendo possível acessá-las
como segue:
É possível criar múltiplos objetos da mesma classe. Cada um deles conterá cópias independentes das variáveis e
funções definidas na classe. Por exemplo, podemos criar mais um objeto da classe MyClass, chamado b e mudar o
valor de my_variable:
Assim, my_variable representa um atributo dos objetos da classe MyClass. Como é esperado que diferentes objetos
tenham valores diferentes em seus atributos, seria incoveniente se fosse necessário modificar os valores dos
atributos após a criação de cada objeto, em outras palavras seria mais interessante que o valor dos atributos
pudesse ser informado no momento da criação do objeto. Para isso, usa-se um método especial, chamado __init__,
também conhecido como construtor. Uma classe com construtor pode ser definida da seguinte forma:
Quando uma classe é definida com um método __init__, a criação de novos objetos da classe automaticamente
invoca __init__ para cada novo objeto. Assim, uma nova instância pode ser criada como:
O primeiro parâmetro dos métodos __init__ e my_func é o mesmo: self. O parâmetro self é uma referência ao
próprio objeto, permitindo acesso aos identificadores definidos no namespace do objeto. No método __init__, a
linha self.my_variable = value cria o atributo my_variable no namespace do objeto, com o valor passado como
argumento. É isso que permite que o valor do atributo seja acessado como b.my_variable. Se uma outra variável
fosse declarada dentro do método __init__, mas sem associá-la ao self, ela não ficaria acessível fora do método.
Exemplo:
Note que ao chamar um método de um objeto, não se deve passar um valor para o parâmetro self. Quando o
método é chamado, self automaticamente se torna uma referência ao objeto associado. Além disso, self não é uma
palavra reservada e não é obrigatório que o primeiro parâmetro chame-se self. Isso é apenas uma convenção.
Questão 1.2
Considere uma classe “Fracao” em Python e dois objetos definidos como segue:
class Fracao:
self.num = num
self.den = den
def __repr__(self):
f1 = Fracao(1, 2)
f2 = Fracao(3, 4)
print(f1)
print(f2)
a) F-V-F
b) V-V-V
c) V-V-F
d) V-F-F
e) F-F-F
RESOLUÇÃO
A instrução print(f2) irá imprimir 3/4. Os atributos da classe Fracao são: num e den.
Questão 2
Implemente uma classe em Python que represente o conceito ‘Horário’, contendo os seguintes atributos: hora,
minuto e segundo. Em seguida, crie um objeto h dessa classe, em que ao executar a instrução ‘print(h)’, o
programa deverá imprimir uma string no formato: ‘hora:minuto:segundo’.
Principais usos: modelagem de situações onde é preciso 'guardar para mais tarde'
vários elementos e lembrar sempre do último elemento armazenado.
Operadores:
Exemplo simples de
Pilha(Pile):Último a entrar, Fila
Encadeada
Estática:
Dinâmica:
Grafos: Grafos são o tipo mais comum de estrutura Não-Linear, demonstrando a relação direta entre diversos
elementos de maneira não consecutiva/linear
Árvores: São um tipo de estrutura de dado Não Linear, separada hieraquicamente por galhos, Permitem tratamento
computacional eficiente quando comparadas a estruturas mais genéricas como grafos. Árvores são ótimas para
busca.
Conceitos e Defininições: Uma árvore T é um conjunto finito de elementos denominados nós(ou vértices) tal que:
Os nós restantes:
Árvores binárias de busca (ABB): Também chamadas 'árvores de pesquisa' ou 'árvores ordenadas'.
Para saber quantos nós cabem em uma árvore de N níveis, usamos a fórmula 𝟐𝑵 − 𝟏
Questão 1.3
a) Pilha.
b) Fila.
c) Árvore.
d) Lista.
e) Grafo.
RESOLUÇÃO
Filas são estruturas de dados em que os primeiros elementos que são inseridos são os primeiros a serem
removidos. Todas as outras alternativas são de estruturas que não têm relação com o conceito do enunciado. Em
uma pilha, o último que entra é o primeiro que sai. Já em árvores, listas e grafos, não há uma ordem de inserção e
remoção pré-definida.
Algoritmos de Ordenação
Ordenação: organizar uma sequência de elementos de modo que os mesmos estabeleçam alguma relação de
ordem. Diz-se que os elementos k1, ..., kn estarão dispostos de modo que k1 ≤ k2 ≤ ... ≤ kn.
Ocasionalmente, dá menos trabalho buscar um elemento em um conjunto desordenado do
que ordenar primeiro e depois buscar. Por outro lado, se a busca for uma operação
frequente, vale a pena ordenar (pode ser feita apenas uma vez).
Terminologia
Bubble sort
• Fácil de entender
• Não necessita memória extra
• Código simples
• Espaço mínimo
• Simples implementação
• Eficiente em datasets pequenos
• Ordenação Estável (a ordem original dos registros é preservada
após a ordenação)
• Espaço mínimo
Implementação em Python
Implementação em Python
Quicksort
• Dividir o vetor em dois vetores menores que serão ordenados independentemente e combinados para
produzir o resultado final.
Vantagens do Quicksort
Desvantangens do Quicksort
Implementação em Python
Heapsort
Utiliza uma estrutura heap para ordenar os elementos. Um heap é uma estrutura de dados em que há uma
ordenação dos elementos: representação via árvore binária.
• Ordem: o item de qualquer nó deve satisfazer uma relação de ordem com os itens dos nós filhos.
o Heap máximo: pai >= filhos
o Heap mínimo: pai <= filhos
• Forma: árvore binária tem que ser completa até o penúltimo nível, sendo que no último nível os nós têm
que estar agrupados à esquerda.
O processo termina até todos os elementos terem sido incluídos no vetor de forma ordenada. É necessário:
Questão 1.4
“Realiza comparações entre elementos consecutivos, de modo que a cada iteração do laço mais externo o
maior elemento é posicionado no final do vetor”.
a) Quicksort
b) Heapsort
c) Radixsort
d) Bubblesort
e) Mergesort
RESOLUÇÃO
O algoritmo Bubblesort realiza comparações entre elementos consecutivos, de modo que a cada iteração do laço
mais externo o maior elemento é posicionado no final do vetor.O Quicksort seleciona um pivô para ordenar os
elementos à esquerda e à direita. O Heapsort utiliza uma árvore binária para ordenar. O Radixsort não é baseado
em comparações, e o Mergesort é baseado em divisão-e-conquista.
Podemos adicionar um texto dentro da janela, para isso usamos o widget Label:
A posição de componentes na janela é gerenciada pelo geometry manager da tkinter, a partir de diretivas definidas
pelo programador. O método pack() é uma forma de fornecer essas diretivas ao sistema.
Uma outra opção para fornecer as diretivas ao geometry manager é por meio do método grid(). Com ele, a janela é
dividida em linhas e colunas, e cada célula pode armazenar um widget.
Questão 3
def clicked():
global entry
name = entry.get()
print('Ola', name)
entry.delete(0, END)
root = Tk()
label.grid(row=0, column=0)
entry = Entry(root)
entry.grid(row=0, column=1)
root.mainloop()
RESOLUÇÃO
O programa cria uma janela com alguns componentes: Label, contendo o texto ‘Nome:’; entry, que é uma caixa de
texto para o usuário inserir algum dado; e um botão que, quando clicado pelo usuário, faz com que a função
clicked() seja executada. Essa função obtém o texto do componente entry e imprime o no terminal precedido da
string ‘Ola’. Desse modo, a variável entry representa um objeto da classe Entry, responsável por adicionar um caixa
de texto na janela, para que o usuário possa inserir um texto pelo teclado.