Exercícios e Desafios!

Neste capítulo estão listados todos os exercícios apresentados no curso e também alguns desafios a mais!

Calculadora

Operadores Matemáticos

  1. Calcule o resto da divisão de 10 por 3.

  2. Calcule a tabuada do 13.

  3. Davinir não gosta de ir às aulas. Mas ele é obrigado a comparecer a pelo menos 75% delas. Ele quer saber quantas aulas pode faltar, sabendo que tem duas aulas por semana, durante quatro meses. Ajude o Davinir!

    Nota

    Um mês tem quatro semanas.

  4. Calcule a área de um círculo de raio \(r = 2\).

    Lembrete: a área de um círculo de raio \(r\) é:

    \[A_\circ = \pi \, r^2\]

Expressões Numéricas

  1. Quantos segundos há em 3 horas, 23 minutos e 17 segundos?

  2. Se você correr 65 quilômetros em 3 horas, 23 minutos e 17 segundos, qual é a sua velocidade média em m/s?

  3. Resolva essa expressão:

    \[\frac{100 - 413 \cdot (20 - 5 \times 4)}{5}\]
  4. Enivaldo quer ligar três capacitores, de valores:

    • \(C_1 = 10 \, \mu F\)
    • \(C_2 = 22 \, \mu F\)
    • \(C_3 = 6.8\, \mu F\)

    Se ele ligar os três em paralelo, a capacitância resultante é a soma:

    \[C_p = C_1 + C_2 + C_3\]

    Se ele ligar os três em série, a capacitância resultante é:

    \[\frac{1}{C_s} = \frac{1}{C_1} + \frac{1}{C_2} + \frac{1}{C_3}\]

    Ou seja:

    \[C_s = \frac{1}{\frac{1}{C_1} + \frac{1}{C_2} + \frac{1}{C_3}}\]

    Qual é o valor resultante em cada um desses casos?

  5. Você e os outros integrantes da sua república (Joca, Moacir, Demival e Jackson) foram no supermercado e compraram alguns itens:

    • 75 latas de cerveja: R$ 2,20 cada (da ruim ainda, pra fazer o dinheiro render)
    • 2 pacotes de macarrão: R$ 8,73 cada
    • 1 pacote de Molho de tomate: R$ 3,45
    • 420g Cebola: R$ 5,40/kg
    • 250g de Alho: R$ 30/kg
    • 450g de pães franceses: R$ 25/kg

    Calcule quanto ficou para cada um.

  6. Krissia gosta de bolinhas de queijo. Ela quer saber quantas bolinhas de queijo dá para colocar dentro de um pote de sorvete de \(2\, L\). Ela pensou assim:

    Um pote de sorvete tem dimensões 15 cm x 10 cm x 13 cm. Uma bolinha de queijo é uma esfera de raio r = 1.2 cm. O fator de empacotamento ideal é 0.74, mas o pote de sorvete tem tamanho comparável às bolinhas de queijo, aí tem efeitos de borda, então o fator deve ser menor. Mas as bolinhas de queijo são razoavelmente elásticas, então empacota mais. Esse valor parece razoável.

    Sabendo que o volume de uma esfera de raio \(r\) é \(V = \frac{4}{3} \pi r^3\), o volume do pote de sorvete é \(V = x \cdot y \cdot z\) e o fator de empacotamento é a fração de volume ocupado pelas bolinhas de queijo. Ou seja, \(74 \%\) do pote de sorvete vai ser ocupado pelas bolinhas de queijo.

    Ajude a Krissia descobrir quantas bolinhas de queijo cabem no pote de sorvete!

Variáveis

  1. Supondo que a cotação do dólar esteja em \(\mathrm{R}\$\, 3{,}25\), salve esse valor em uma variável e utilize-o para calcular quanto você teria ao cambiar \(\mathrm{R}\$\, 65{,}00\) para dólares.

  2. Abelindo é um professor muito malvado. Ele quer decidir como reprovar Rondinelly, que tirou 8.66, 5.35, 5 e 1, respectivamente, nas provas P1, P2, P3 e P4. Para isso, ele pode calcular a nota final usando média aritmética (M.A.), média geométrica (M.G.) ou média harmônica (M.H.).

    \[M.A. = \frac{P_1 + P_2 + P_3 + P_4}{4}\]
    \[M.G. = \sqrt[4]{|P_1 P_2 P_3 P_4|}\]
    \[M.H. = \frac{4}{\frac{1}{P_1} + \frac{1}{P_2} + \frac{1}{P_3} + \frac{1}{P_4}}\]

    Qual dessas médias dá a maior nota pra Rondinelly? E qual das médias dá a pior nota?

  3. Josefson deseja fazer compras na China. Ela quer comprar um celular de \(\mathrm{USD}\, 299{,}99\), uma chaleira de \(\mathrm{USD}\, 23{,}87\), um gnomo de jardim de \(\mathrm{USD}\, 66{,}66\) e 6 adesivos de unicórnio de \(\mathrm{USD}\, 1{,}42\) cada um. O frete de tudo isso para a cidade de Rolândia, no Paraná, ficou em \(\mathrm{USD}\, 12{,}34\).

    1. Calcule o valor total da compra em dólares.
    2. Usando o mesmo valor do dólar do exercício anterior, calcule o preço final em Reais. Lembre-se que o valor do IOF é de \(6{,}38 \, \%\).
    3. Quanto ela pagou apenas de IOF?

Desafios

  1. Joilson está aprendendo Arduino. Ele quer ligar LEDs nas saídas digitais do Arduino. Cada pino fornece \(5\, V\). Joilson sabe que tem que ligar um resistor em série com o LED para não queimar. Calcule o valor do resistor que deve ser ligado para cada um desses LEDs, sabendo que a corrente de operação de cada um dos LEDs é de \(20\, mA\):

    • LED vermelho: opera em \(2.0\, V\)
    • LED verde: opera em \(3.2\, V\)
    • LED roxo: opera em \(3.7\, V\)

    Lembre-se que a voltagem é a corrente multiplicada pela resistência:

    \[V = R I\]
  2. D3yver50n resolveu minerar criptomoedas. Ele decidiu minerar Ethereum e viu que \(1\, ETH = \$687.86\) e \(\$1 = \mathbb{R}\$3.59\). Ele comprou o seguinte computador:

    • 5 placas de vídeo: GTX1080 TI, cada uma por R$5270,90
    • 1 placa mãe: ASRock H110 Pro, por R$920
    • 1 fonte: 1600 W, por R$2299,90
    • 1 HD: 1 TB, SATA3, 7200 RPM por R$208,90
    • 2 pentes de memória: 4 GB, DDR4, 2400 MHZ, cada um por R$259,90
    • 1 CPU: Intel Core i5-8500 por R$899,90

    E resolveu montar usando uma estante de madeira e dois tijolos, para refrigerar melhor:

    _images/cluster.jpg

    Essas GPUs (placas de vídeo) conseguem minerar Ethereum a uma taxa de \(\approx 27 Mh/s\) (mega hash / s = \(10^6\) hash / s). Cada bloco minerado dá uma recompensa de 3 ETH. Considere a dificuldade da rede de \(3.29 \cdot 10^{15}\), o block time médio de \(15.44\, s\).

    Para calcular quantos dólares por segundo ele vai ganhar com esse computador, D3yver50n fez as seguintes contas:

    \[ETH / s = \mathrm{cluster\_ratio} \frac{recompensa}{\mathrm{block\_time}}\]

    O cluster_ratio é calculado como:

    \[\mathrm{cluster\_ratio} = n_\mathrm{GPU} \frac{\mathrm{GPU\_hashrate}}{\mathrm{network\_hashrate}}\]

    onde \(n_\mathrm{GPU}\) é o número de placas de vídeo que ele tem. O network_hashrate é calculado como:

    \[\mathrm{network\_hashrate} = \frac{\mathrm{dificuldade}}{\mathrm{block\_time}}\]
    1. Calcule quantos ETH por segundo D3yver50n vai ganhar com esse PC.
    2. Calcule quantos dólares por segundo ele vai ganhar.
    3. Calcule quanto ele vai pagar de energia elétrica por segundo para manter esse computador ligado, sabendo que o custo de energia elétrica é de \(0.008 \mathrm{ centavos} / kW\).
    4. Após um mês, quantos ETH ele vai ganhar? Isso equivale a quantos reais? Quanto de energia elétrica ele vai gastar? Deu lucro ou prejuízo?
    5. Se ele teve lucro, após quanto tempo ele ganha o dinheiro que investiu no computador de volta?

Strings

  1. Dada a frase Python é muito legal., use fatiamento para dar nome às variáveis contendo cada palavra. O resultado final deve ser:

    >>> frase = "Python é muito legal."
    # resolução do problema aqui
    >>> palavra1
    "Python"
    >>> palavra2
    "é"
    >>> palavra3
    "muito"
    >>> palavra4
    "legal"
    
  2. Qual o tamanho dessa frase? E qual o tamanho de cada palavra?

  3. Agora que conhecemos atribuição múltipla e o método str.split() refaça os dois exercícios anteriores usando essas técnicas.

  4. Use slicing (mais especificamente o passo do fatiamento) para inverter a string «Python».

Desafios

  1. Por que o seguinte código retorna uma string vazia?

    >>> texto = "No alto da montanha havia uma rosa"
    >>> texto[0:-1:-1]
    ''
    

    Nota

    >>> texto = "No alto da montanha havia uma rosa"
    >>> texto[0:-1]
    'No alto da montanha havia uma ros
    

Teclado

  1. Leia um nome pelo teclado e imprima "Olá, <nome lido>!"

  2. Leia outro nome pelo teclado e imprima:

    <nome lido> roubou pão na cassa do <nome2 lido>!
    <nome2 lido> ficou triste e com fome,
    porque o bandejão estava fechado.
    
  3. Leia uma frase pelo teclado e a imprima ao contrário.

    Por exemplo, se a frase for "Manjo muito de Python!", a saída deverá ser '!nohtyP ed otium ojnaM'.

Listas

  1. Crie uma lista com o nome das 3 pessoas mais próximas.

  2. Crie três listas, uma lista de cada coisa a seguir:

    • frutas
    • docinhos de festa (não se esqueça de brigadeiros!!)
    • ingredientes de feijoada

    Lembre-se de salvá-las em alguma variável!

    1. Agora crie uma lista com essas três listas.

    Nessa lista de listas (vou chamar de listona):

    1. você consegue acessar o elemento brigadeiro?
    2. Adicione mais brigadeiros à segunda lista de listona.
    3. Adicione bebidas ao final da listona, mas sem criar uma lista!
  3. Utilizando o del, remova todos os elementos da lista criada anteriormente até a lista ficar vazia.

  4. Faça uma lista de compras do mês, não se esqueça de comprar produtos de limpeza e sorvete!

    Agora «vá ao mercado» e delete apenas os produtos de limpeza da lista.

    Agora «vá à sorveteria» e se empanturre de sorvete e tire o sorvete da lista.

  5. Dado uma lista de números, faça com que os números sejam ordenados e, em seguida, inverta a ordem da lista usando slicing.

Dicionários

  1. Faça um dicionário com as 5 pessoas mais perto de você, tendo o nome como chave e a cor da camisa que está usando como valor.
  2. Crie um dicionário vazio semana = {} e o complete com uma chave para cada dia da semana, tendo como seu valor uma lista com as aulas que você tem nesse dia (sábado e domingo recebem listas vazias, ou você tem aula?).
  3. Crie um dicionário vazio filmes = {}. Agora preencha-o com o nome de cinco filmes como chaves e outros dicionários contendo o respectivo vilão e o ano em que cada filme foi lançado como valor.

Estruturas de Controle

  1. Escreva um programa que, dados 2 números diferentes (a e b), encontre o menor deles.

  2. Para doar sangue é necessário [1]:

    • Ter entre 16 e 69 anos.
    • Pesar mais de 50 kg.
    • Estar descansado (ter dormido pelo menos 6 horas nas últimas 24 horas).

    Faça um programa que pergunte a idade, o peso e quanto dormiu nas últimas 24 h para uma pessoa e diga se ela pode doar sangue ou não.

  3. Considere uma equação do segundo grau \(f(x) = a \cdot x^2 + b \cdot x + c\). A partir dos coeficientes, determine se a equação possui duas raízes reais, uma, ou se não possui.

    Dica: \(\Delta = b^2 - 4 \cdot a \cdot c\) : se delta é maior que 0, possui duas raízes reais; se delta é 0, possui uma raiz; caso delta seja menor que 0, não possui raiz real

  4. Leia dois números e efetue a adição. Caso o valor somado seja maior que 20, este deverá ser apresentado somando-se a ele mais 8; caso o valor somado seja menor ou igual a 20, este deverá ser apresentado subtraindo-se 5.

  5. Leia um número e imprima a raiz quadrada do número caso ele seja positivo ou igual a zero e o quadrado do número caso ele seja negativo.

  6. Leia um número inteiro entre 1 e 12 e escreva o mês correspondente. Caso o usuário digite um número fora desse intervalo, deverá aparecer uma mensagem informando que não existe mês com este número.

[1]Para mais informações sobre doação de sangue, acesse http://www.prosangue.sp.gov.br/artigos/requisitos_basicos_para_doacao.html

Desafios

  1. Escreva um programa que, dados 3 números diferentes (a, b e c), encontre o menor deles.

  2. Dado 3 valores inteiros lidos do teclado: A, B e C, retorne a soma deles. Porém, caso algum desses valores seja 13, então ele não conta para a soma, e os valores a sua direita também não.

    Por exemplo:
    1, 2, 3 -> 6
    1, 2, 13 -> 3
    1, 13, 3 -> 1
    13, 2, 3 -> 0

Estruturas de repetição

  1. Calcule a tabuada do 13.

  2. Ler do teclado uma lista com 5 inteiros e imprimir o menor valor.

  3. Ler do teclado uma lista com 5 inteiros e imprimir True se a lista estiver ordenada de forma crescente ou False caso contrário.

  4. Exiba em ordem decrescente todos os números de 500 até 10.

  5. Ler do teclado 10 números e imprima a quantidade de números entre 10 e 50.

  6. Ler do teclado a idade e o sexo de 10 pessoas, calcule e imprima:

    1. idade média das mulheres
    2. idade média dos homens
    3. idade média do grupo
  7. Calcule o somatório dos números de 1 a 100 e imprima o resultado.

Funções

  1. Faça uma função que determina se um número é par ou ímpar. Use o % para determinar o resto de uma divisão. Por exemplo: 3 % 2 = 1 e 4 % 2 = 0

  2. Faça uma função que calcule a área de um círculo. Insira o raio como argumento.

    Dica: faça a importação de math e use \(\pi\) de lá.

    \[A = \pi R^2\]
  3. Crie uma função que receba um valor de temperatura em Fahrenheit e transforme em Celsius.

    Relembrar é viver:

    \[\frac{C}{5} = \frac{F - 32}{9}\]
  4. Alanderson quer saber se um endereço IP é válido. Faça um programa para ajudar Alanderson a testar se um endereço é válido.

    Para isso, a entrada deve ser um endereço IP (digitado pelo usuário) e o programa deve escrever na tela se é válido ou não. Um endereço IPv4 é composto por 4 números inteiros entre 0 e 255, separados por um ponto.

    Por exemplo, o endereço 123.123.123.123 é válido, mas 666.123.k.3 não é.

  5. Crie uma função que receba 3 valores e calcula as raízes da fórmula de Bhāskara.

    \[x = \frac{-b \pm \sqrt{b^2 - 4 \cdot a \cdot c}}{2 \cdot a}\]

    Dica: raiz quadrada é sqrt(), importando math: math.sqrt()

    Faça um teste com bhaskara(1, -4, -5) e o programa deve obter as raízes: (5.0, -1.0)

  6. Dada a função: \(y = 5x + 2\), determine os valores de \(y\) para \(x\) entre -10 a +10, onde \(x\) é inteiro

  7. Escreva uma função chamada has_duplicates que tome uma lista e retorne True se houver algum elemento que apareça mais de uma vez. Ela não deve modificar a lista original.

  8. Duas palavras são um “par inverso” se uma for o contrário da outra. Escreva uma função que dado duas palavras, retorne True caso sejam.

  9. Escreva uma função que imprime todos os números primos entre 1 e 50

    Dica: um número é primo se ele for divisível apenas por 1 e ele mesmo, use o operador % (resto da divisão) para isso.

  10. Duas palavras são anagramas se você puder soletrar uma rearranjando as letras da outra. Escreva uma função chamada is_anagram que tome duas strings e retorne True se forem anagramas ou False caso contrário.

  11. Escreva uma função que retorne uma lista com todas as chaves de um dicionário que contém um certo valor.

    Por exemplo, se o dicionário for {'a': 1, 'b': 2, 'c': 1, 'd': 4}, a função deve retornar ['a', 'c'] caso procure pelo valor 1; [] caso procure pelo valor 666.

  12. Escreva uma função que dado um número, calcule o fatorial desse número. Por exemplo, fatorial de 5:

    \[5! = 5 \cdot 4 \cdot 3 \cdot 2 \cdot 1 = 120\]
  13. Crie uma função que aproxima a função matemática seno, utilizando a seguinte equação:

    \[\sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!} x^{2n+1}\]

    Essa é a expansão em Série de Taylor da função. Note que esta é uma série infinita! A sua função deve truncar a série em algum momento, ou seja, sua função vai calcular uma aproximação para o seno de um ângulo:

    \[\sin(x) \approx \sum_{n=0}^{N} \frac{(-1)^n}{(2n+1)!} x^{2n+1} = \sum_{n=0}^{N} a_n = S_N\]

    Note que, quanto maior o valor de N, melhor é a aproximação. Mas isso tem um custo: maior vai ser o número de termos nessa série e consequentemente, maior o tempo de execução desse código.

    Uma possibilidade é estipular previamente uma precisão a ser atingida pelo código. Ou seja, definimos o desvio máximo \(\epsilon\) que nossa aproximação tem com relação ao valor exato! Isso é feito comparando dois termos consecutivos da série: se a diferença \(\delta\) entre eles (em valor absoluto!) for menor que \(\epsilon\), atingimos a precisão desejada:

    \[\delta = | S_N - S_{N-1} |\]

    Implemente, então, uma função que receba como argumentos:

    • \(x\): o ângulo (em radianos!!).
    • \(N_\mathrm{max}\): o número máximo de iterações.
    • \(\epsilon\): a precisão da aproximação.

    e calcule uma aproximação para \(\sin(x)\) usando duas condições de parada: número máximo de termos na série é \(N_\mathrm{max}\) e precisão \(\epsilon\). Ou seja, sua aproximação terá no máximo \(N_\mathrm{max}\) termos, mas pode ter menos termos caso a precisão desejada seja atingida ( \(\delta < \epsilon\)).

  14. Calcule \(\pi\) usando um método de Monte Carlo.

    Monte Carlo é uma classe de métodos para resolver problemas usando estatística. Aqui você vai implementar uma função usando um desses algoritmos para calcular o número \(\pi\).

    Dado um círculo de raio \(R\) dentro de um quadrado de lados \(2R\), a razão entre a área do círculo para a área do quadrado é:

    \[\frac{A_\bigcirc}{A_\square} = \frac{\pi R^2}{4 R^2} = \frac{\pi}{4}\]

    Ou seja, se você escolher aleatoriamente um ponto dentro do quadrado, a probabilidade dele cair dentro do círculo é de \(\pi / 4\). Se você escolher \(N\) pontos aleatórios dentro do quadrado, cerca de \(N \pi / 4\) estarão dentro do círculo.

    Então, basta escolher pontos aleatórios dentro do quadrado e ver se estão dentro do círculo

    Um ponto \((x, y)\) está dentro do círculo se \(x^2 + y^2 \leq R^2\).

    Faça uma função que receba como argumento um número \(N\) de pontos \((x, y)\) (aleatórios) a serem sorteados. Dentro dessa função, você deve fazer um laço que sorteie esses \(N\) pontos e veja quantos estão dentro do círculo. Se \(M\) pontos caírem dentro do círculo, então a probabilidade de um ponto aleatório estar dentro do círculo é aproximadamente \(M / N\). Então, podemos estimar \(\pi\) como:

    \[\pi \approx \frac{4 M}{N}\]

    Para sortear um número aleatório entre \(a\) e \(b\) utilize a função uniform(a, b) do módulo random. Exemplo:

    >>> import random
    >>> random.uniform(1, 2) # número aleatório entre 1 e 2
    1.8740445361226983
    

    Perceba que ao executar a função pi() várias vezes seguidas, o resultado é sempre diferente. Então faça um laço para calcular pi() \(K\) vezes, salve os resultados em uma lista e calcule o valor médio e o desvio padrão.