Coleções de dados e representação

Dicionário

  1. Em Python, os dicionários não têm uma ordem natural. Escreva uma função que receba um dicionário e devolva uma lista ordenada de tuplas 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 dado um número $n$, devolva um dicionário com chaves $(1, 2, \dots, n)$ que contenha, 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, dada uma string, faça em um dicionário de vocabulário e o número de vezes que a palavra aparece, faça o mesmo para cada letra. Não precisa estar em ordem alfabética.

    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. Crie um sugestor de palavras, que dada uma string de entrada e um prefixo, ele te devolve o vocabulário total em ordem alfabética, e te recomenda as palavras que começem com o prefixo. Por exemplo, para o texto

    Os otimistas sao ingenuos, os pessimistas sao amargos, mas vale ser um realista esperancoso.

    com parâmetros real e otim, a saída é:

    Vocabulario:
    amargos (1)
    esperancoso (1)
    ingenuos (1)
    mas (1)
    os (2)
    otimistas (1)
    pessimistas (1)
    realista (1)
    sao (2)
    ser (1)
    um (1)
    vale (1)
    Sugestoes:
    real: realista
    otim: otimistas
    
  5. Faça um programa que receba várias partidas de futebol na entrada e organize na saída a pontuação e indique o vencedor. Leia a entrada até o caractere '.'.

    Ibis 0 x Cascavel 3
    Cascavel 2 x Ibis 0
    Ibis 0 x Dourados 1
    Dourados 2 x Ibis 0
    Cascavel 3 x Dourados 2
    Dourados 3 x Cascavel 1
    .
    
    Cascavel 9 3 4 9
    Dourados 9 3 4 8
    Ibis 0 0 -8 0
    Vencedor: Cascavel
    

Conjuntos e Tuplas

  1. Considere as estruturas de conjuntos (sets), e.g., A = {1, 2, 3, 5, 7} e B = {1, 3, 4, 6, 5}. Implemente as operações abaixo. Escreva duas implementações, uma utilizando os operadores nativos de Python e outras sem utilizar.

    a) $A \cup B$

    b) $A \cap B$

    c) $A \setminus B$

    d) Pesquise sobre os conjuntos na documentação do Python e descreva as diferenças entre usar os operadores diretamente e fazer chamadas de atributos, por exemplo, qual a diferença das duas instruções abaixo:

    A - B
    A.difference(B)
    A.difference_update(B)
    
  2. Faça em Python, as seguintes operações com a tupla T = (1,"Oi",1,2,3,4):

    a) Inverta a tupla

    b) Faça slice na tupla, pegando apenas os elementos da posição 1 a 3

  3. Compare listas e tuplas. Discuta porque tuplas existem em Python e qual a diferença entre usar uma tupla e uma lista. Faça uma pesquisa, caso necessário.

Conjuntos de dados estruturados

  1. Faça um programa que representa um estudante em um dicionário, contendo nome, idade e 3 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, os triângulos podem conter cores.

    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. Representamos cotações de uma fruta utilizando uma tupla, como a estrutura do exemplo ("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. 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 valores possíveis.

    a) Descreva uma variável para representar um estado. Considere duas representações possíveis, uma utilizando 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.

  5. Descreva uma estrutura de dados que representa um polinômio de grau arbitrário.

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

Exercícios criativos

  1. 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. Por outro lado, 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.

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

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

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