Lista 8 - Coleções de dados e representação

Dicionário, conjuntos e tuplas

  1. Em Python, os dicionários não são ordenados nem pelas chaves nem pelo valor. Ao iterarmos um dicionário, vemos os elementos na ordem que inserimos. Escreva uma função que receba um dicionário e devolva uma lista de tuplas (chave, valor) ordenadas pelo valor.

    Dicionário:  {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
    Lista de tuplas ordenada:  (0, 0), (2, 1), (1, 2), (4, 3), (3, 4)
    
  2. Escreva uma função que recebe um número $n$ e devolve um dicionário com chaves $(1, 2, \dots, n)$ contendo, respectivamente, os valores $(1, 4,… n^2)$.

    n = 5
    Saida: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    
  3. Escreva uma função que recebe uma string e crie um dicionário representando o número de vezes que a palavra aparece. Depois, faça a mesma coisa para cada caractere.

    isso e um teste az teste isso
    dicionario_palavras = {
     'isso': 2,
     'e': 1,
     'um': 1,
     'teste': 2,
     'az': 1
    }
    dicionario_letras = {
     'i': 2,
     's': 6,
     'o': 2,
     ' ': 6,
     'e': 5,
     'u': 1,
     'm': 1,
     't': 4,
     'a': 1,
     'z': 1
    }
    
  4. Em um campeonato de futebol, a vitória vale 3 pontos e o empate vale 1. Os times são ordenados por pontos e, havendo empate, pelo saldo de gols. Crie um programa que receba os resultados de várias partidas de futebol mostre a tabela de classificação.

    Entrada:

    Ibis 0 x Cascavel 3
    Cascavel 2 x Ibis 0
    Ibis 0 x Dourados 1
    Dourados 2 x Ibis 0
    Cascavel 3 x Dourados 1
    Dourados 3 x Cascavel 1
    

    Saída:

    Time        Pontos  Saldo
    Cascavel         9      5
    Dourados         9      3
    Ibis             0     -8
    
  5. Considere as estruturas de conjuntos A = {1, 2, 3, 5, 7} e B = {1, 3, 4, 6, 5}. Implemente as operações abaixo. Para cada operação, faça duas implementações, uma utilizando os operadores nativos de Python e outra sem utilizar.

    a) $A \cup B$

    b) $A \cap B$

    c) $A \setminus B$

  6. Pesquise sobre os conjuntos na documentação do Python e descreva as diferenças entre usar os operadores diretamente e fazer chamadas a métodos, por exemplo, qual a diferença das instruções abaixo?

    A - B
    A.difference(B)
    A.difference_update(B)
    
  7. Implemente as seguintes operações com uma tupla de seis posições, e.g., (1,"Oi",1,2,3,4).

    a) Inverter a tupla, e.g., obtendo (4, 3, 2, 1, "Oi", 1).

    b) Obter uma “subtupla” com os elementos da posição 1 a 3, e.g., obtendo (3, 2, 1).

  8. Lembre-se de que tuplas em Python são imutáveis, i.e., não podemos alterar o obejeto ao qual uma posição se refere. Também não podemos adicionar ou remover elementos em uma tupla, de forma que ela sempre terá o número de elementos de quando foi criada.

    a) Compare listas e tuplas e discuta em que situações é preferível utilizar uma tupla e em que situações é preferível usar uma lista. Faça uma pesquisa, caso necessário.

    b) Embora não possamos mudar elementos, podemos criar novas tuplas a partir de tuplas antigas. Crie uma função que recebe um número dy e uma tupla (x, y, z) representando um ponto no espaço e devolva uma nova tupla representando o ponto delocado acima de dy.

    c) Uma tupla é imutável, mas os elementos a que ela se referem podem ser mutáveis. O uso descuidado de mutabilidade pode levar a resultados desagradáveis. Qual a saída do trecho a seguir? Explique.

     numeros = [1, 2, 3, 4]
     nomes = ["um", "dois", "três", "quatro"]
     names = ["one", "two", "three", "four"]
    
     dados_pt = ("portugues", numeros, nomes)
     dados_en = ("inglês", numeros, names)
    
     dados_pt[1].append(5)
     dados_pt[2].append("cinco")
     dados_en[1].append(6)
     dados_en[2].append("six")
    
     print(numeros)
     print(nomes)
     print(names)
    

Conjuntos de dados estruturados

  1. Faça um programa que representa um estudante em um dicionário, contendo nome, idade e três notas de provas — seguindo o modelo abaixo. Seu programa deverá receber um conjunto de estudantes e devolver a maior média.

    estudante = {
        "nome": "João",
        "idade": 18,
        "notas": [10, 5, 3]
    }
    
  2. Triângulos:

    a) Faça, com dicionários, uma estrutura para representar um triângulo que contém os pontos correspondentes aos três vértices. Além disso, um triangulo tem uma cor associada.

    b) Escreva uma função que receba uma lista de triângulos e devolva aquele que possui o maior perímetro.

    c) Escreva uma função que receba uma lista de triângulos e desloque à esquerda por uma distância $d$ aqueles que forem pretos.

  3. Suplha que representamos cotações de uma fruta utilizando uma tupla, como a estrutura ("Laranja", 4.50, (15, 1, 2020)), que representa que o valor da laranja no dia 15/1/2020 era R$ 4,50.

    a) Crie uma função que receba uma lista de cotações e calcule o valor médio de uma determinada fruta.

    b) Crie uma função que devolva a lista de todas as frutas que foram cotadas em determinado mês.

  4. Suponha que para organizar os dados de turmas de um determinado instituto de ensino, usamos um esquema como representado no exemplo abaixo:

    turmas = [
        {
            "professor": "Antônio",
            "alunos": [
                {
                    "nome": "João",
                    "notas": {
                        "exercicios": 70,
                        "provas": 80
                    },
                },
                {
                    "nome":"Maria",
                    "notas": {
                        "exercicios": 65,
                        "provas": 100
                    }
                },
            ]
        },
    ]
    

    a) Escreva uma instrução que imprima a nota das provas de Maria:

    b) Suponha que os dados das turmas está salvo em um arquivo turmas.json. Utilize o módulo json de Python para ler o arquivo. Depois, calcule a média de cada uma das turmas.

  5. Um semáforo pode estar em exatamente um estado de algumas possibilidades: vermelho, amarelo, verde, piscando, ou desligado. Enquanto há várias possibilidades, essa lista nunca muda, isso é, podemos enumerar todos os estados possíveis.

    a) Descreva uma variável para representar um estado. Considere duas representações possíveis, uma representando o estado por inteiros e outra por uma string. Qual esquema você utilizaria? Explique comparando vantagens e desvantagens de cada uma.

    b) Descreva uma tupla para representar um semáforo em um determinado momento. Cada semáforo tem um identificador, que é um número inteiros. A partir da tupla, deve ser possível descobrir o estado do semáforo.

    c) Suponha que temos uma lista guardando o estado de todos os semáforos em cada segundo do dia. Como você faria para listar os momentos em que um determinado semáforo abriu.

  6. Descreva uma estrutura de dados que representa um polinômio de grau arbitrário. Suponha que é importante realizar operações de soma e subtração de polinômio, bem como multiplicar por um escalar.

  7. Em um sistema computacional de auxílio a matemáticos (Maple, Mathematica, Sage…), um número pode ser real, inteiro, complexo, racional, ou a solução de um sistema algébrico. No entanto, as operações aritméticas e várias outras funções são aplicadas uniformemente sobre os números, independente do tipo.

    a) Defina um esquema para representar exatamente um número. O número pode ser racional, inteiro ou raiz $n$-ésima de um número não-negativo.

    b) Faça uma função que imprima um número na sua forma natural de representação.

    c) Faça uma função que receba dois números e devolva verdadeiro se o primeiro for menor que o segundo.

Exercícios criativos

  1. Um sinal sonoro digital nada mais é do que uma sequência de amostras no intervalo $[-1, 1]$, ou outro intervalo de intensidades de uma onda sonora. Na imagem, as intensidades variam de $0$ até $15$. Essas amostras são proporcionais à amplitude da onda em determinado instante. Assim, um “som” de 44,1 kHz como um CD tem 44.100 amostras em cada segundo e tem qualidade muito melhor do que algumas ligações telefônicas com 8 kHz.

    a) Um som estéreo nada mais é do que dois canais de som (esquerda e direta). Descreva uma estrutura de dados para representar um som estéreo.

    b) Escreva uma função para ler do teclado um som estéreo (as amostras são apresentadas de forma alternada, esquerda, direita, esquerda, direita, ….).

    c) Pelo princípio de interposição das ondas, quando duas pessoas falam ao mesmo tempo, as amplitudes se somam. Pensando nisso, escreva uma função que faça a mixagem (mistura) de dois “sons” estéreos.

    d) Fisicamente, os auto-falantes têm limitações de pressão, por isso as amostras são limitadas. Assim, se tivermos uma sequência 0,7; 0,8; 1,0; 1,2; 1,3; 1,2; 1,1; 1,0; 0,8, o auto-falante tocará como se fosse 0,7; 0,8; 1,0; 1,0; 1,0; 1,0; 1,0; 1,0; 0,8. Isso explica as distorções quando aumentamos o volume. Uma maneira (bem rudimentar) de corrigir isso é normalizando o sinal, isso é, dividindo cada valor pelo maior valor encontrado na sequência. Implemente uma função que normalize um som.

  2. Normalmente um artista dispõe de poucas cores de tinta puras e obtém outras cores misturando e compondo as diversas tonalidades. Por exemplo, misturando a tinha vermelha e azul, obtemos o roxo. As cores primárias disponíveis são azul, amarelo e vermelho. Assim, para representar o roxo, usamos 50% de azul, 50% de vermelho e 0% de amarelo. Podemos ainda misturar o roxo com o amarelo, obtendo uma cor composta de 25% de azul, 25% de vermelho e 50% de amarelo. Além dessas, normalmente ainda estão disponíveis o preto e o branco. As cores preto e branco têm o efeito de escurecer ou clarear a cor obtida da combinação. Assim, podemos ter um azul com 75% de branco, que é um azul bem clarinho. Ainda, um vermelho com 100% de preto é simplesmente preto e não contém nenhum pigmento do vermelho!

    a) Descreva uma estrutura para representar uma cor de tinta como descrita acima.

    b) Implemente uma função que receba como entrada duas cores e devolva uma nova cor com a composição das duas.

    c) Implemente uma função que determine se duas cores dadas como entrada são iguais. Duas cores devem ser consideradas iguais, mesmo que uma seja mais escura e outra mais clara, mas correspondam à mesma tonalidade.

  3. Um desafio: Um polígono simples pode ser definido como uma sequência de pontos não coincidentes no plano de forma que ao traçar segmentos que ligam esses pontos em ordem, eles não se cruzem. A área à esquerda delimitada pelo percorrimento desses segmentos é a região do polígono.

    a) Defina uma estrutura para representar um polígono simples (no plano).

    b) Escreva uma função que remova um vértice específico do polígono.

    c) Escreva uma função para devolver a menor coordenada e a menor abscissa de vetor de pontos.

    d) Escreva uma função para construir um novo polígono que é o bounding box do polígono, isso é, o menor retângulo que contém o polígono.

    e) Um polígono simples é convexo se, ao percorrer os segmentos, sempre viramos à esquerda. Escreva uma função para calcular a área da região de um polígono convexo.