Lista 4 - Listas

Listas

  1. Escreva um programa que leia uma lista de números, descubra o menor elemento e imprima o valor e a posição. Exemplo de execução:

    Digite uma lista: 8 2 7 5 3 4 2 9
    Um menor elemento vale 2 e está na posição 1.
    
  2. Faça uma programa que leia uma lista $x$ de números reais e devolve o desvio padrão corrigido usando a seguinte fórmula:

    $$ s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}, $$

    onde $n$ é o número de elementos e $\bar{x}$ é a média dos elementos.

  3. Escreva um programa que recebe uma lista e um inteiro $m$ e realiza um deslocamento à esquerda de tamanho m. Por exemplo a seguinte figura apresenta uma lista de tamanho 5, no qual se realiza um deslocamento de tamanho 2.

  4. Dada uma lista de inteiros, imprima a maior subsequência (com maior quantidade de elementos) estritamente crescente. Exemplo de execução:

    Digite a lista: 10 20 3 4 5 6 7 50 10 100 200 300 2 3
    Uma maior subsequencia crescente é 3 4 5 6 7 50 e tem 6 elementos.
    
  5. Escreva um algoritmo que receba uma lista de inteiros $A$ e dois índices $i$ e $j$ e calcule a soma da sublista $A[i..j]$, isso é, imprima o valor de $A[i] + … + A[j]$.

  6. Faça um programa que leia uma lista de 10 caracteres que representam o gabarito de uma prova de múltipla escolha e outra lista de 10 caracteres que representam as respostas de um estudante. O programa deve imprimir o número de acertos do estudante.

  7. Escreva um programa que leia dois conjuntos de nomes e calcule a interseção, a união e a diferença desses conjuntos. Lembre-se de que em um conjunto não pode haver repetição de elementos e a ordem dos elementos é irrelevante. Exemplo de execução:

    Digite o conjunto 1: 8 2 7 5 3 4 9
    Digite o conjunto 1: 1 5 6 9
    A interseção é: 5 9
    A união é: 8 2 7 5 3 4 9 1 6
    A diferença é: 8 2 7 3 4
    
  8. Faça um algoritmo que leia o nome de cinco alunos, as notas de português, matemática e física de cada um deles, calcule a média de cada uma das disciplinas e a média geral. Escreva as médias de português, matemática, física e média geral.

  9. Suponha que um texto é formado por letras, vírgulas, pontos e espaços em branco. Escreva um programa que leia um texto e imprima uma lista das palavras (sem repetição) que têm comprimento menor ou igual a 5.

  10. Leia o trecho abaixo.

    lista1 = [1, 2, 4, 7, 5, 9]
    lista2 = lista1
    pares = []
    for i in range(len(lista2)):
       if lista2[i] % 2 == 1:
          lista2[i] = 2 * lista2[i]
    for numero in lista1:
       if numero % 2 == 0:
          pares.append(numero)
    print(pares)
    

    a) Qual a saída do programa? Explique.

    b) Reescreva o programa usando apenas list comprehensions.

Repetição limitada

  1. Faça um algoritmo que, para cada número inteiro de 1 até 100, imprima “tic” se esse número for múltiplo de 3, imprima “toc” se for múltiplo de 5 e imprima “tic-toc” se for múltiplo de 15.

  2. Faça um algoritmo para calcular e escrever o fatorial de um determinado número lido.

  3. Faça um programa que lê um número $n$ e crie uma lista de todos divisores de $n$ entre $2$ e $n - 1$.

  4. Para verificar se um número é primo, não precisamos testar todos os divisores entre $2, \dots, (n−1)$, basta testarmos até $n/2$, já que o maior divisor próprio de $n$ não pode ser maior do que $n/2$. Se prestarmos mais atenção, descobriremos que verdade basta testar os números $2,\dots, \sqrt{n}$. Por quê?

  5. Você possui um vergalhão com $L$ centímetros e deseja construir uma caixa de ferro. A estrutura conterá um pedaço de vergalhão em cada aresta da caixa. Para evitar desperdício, a caixa deverá usar todo o vergalhão, mas ficará em um recinto de volume no máximo $V$ cm³. Faça um programa que imprima todas as dimensões inteiras em centímetros possíveis para essa caixa.

  6. Elabore um programa para calcular a raiz quadrada de um número positivo, usando o roteiro abaixo, baseado no método de aproximações sucessivas de Newton. O algoritmo deverá prover 20 aproximações. Seja $Y$ o número:

    a) a primeira aproximação para a raiz quadrada de $Y$ é $X_1 = \frac{Y}{2}$

    b) as sucessivas aproximações serão $X_{n+1} = \frac{X^2_n + Y}{2 X_n}$.

  7. Escreva um programa que leia uma lista de $n$ números de ponto flutuante e separe esses números nos seguintes intervalos de tamanho uniforme: $[0, 25)$, $[25, 50)$, $[50, 75)$ e $[75, 100)$. Exemplo de execução:

    Digite a lista:
    2.0 61.5 −1.0 0.0 88.7 94.5 55.0 3.1415 100.0 75.0
    
    Intervalo [0, 25): 2.0 0.0 3.1415
    Intervalo [25, 50): (nenhum número)
    Intervalo [50, 75): 61.5 55.0
    Intervalo [75, 100): 88.7 94.5 75.0
    
  8. O que será impresso pelo programa abaixo? Assuma que o valor de D na declaração de x é o valor do último dígito do seu RA. Faça um teste de mesa, isso é, execute usando lápis e papel. Depois verifique sua resposta usando um computador. Finalmente, simule o algoritmo passo a passo utilizando um debugger e configurando breakpoints no início de cada iteração. Se não souber como utilizar um debugger, procure ajuda de um monitor.

    lista = []
    n = 10 + D
    while n != 0:
        lista.append(n % 2)
        n = n // 2
    for d in reversed(lista):
        print(d, end='')
    

Legibilidade de código

À medida em que os programas que escrevemos se tornam maiores, precisamos nos preocupar com o quão fácil é ler e entender o código. Chamamos isso de legibilidade de código. Para um código ser legível, ele deve ter pelo menos algumas características:

Um pouco de maniqueísmo - Comentários

Mal:

import math

# lê um valor do teclado
x = input()
# lê outro valor
y = input()
# calcula o x ao quadrado
# mais y ao quadrado
z = x*x + y*y;
# tira a raiz de z
z = math.sqrt(z)
# mostra o valor de z
print(z)

Bem:


import math

# lê valores dos catetos
x = float(input())
y = float(input())

# aplica Pitágoras
z = x*x + y*y
z = math.sqrt(z)

# devolve a hipotenusa
print(z)

Um pouco de maniqueísmo - Indentação

Mal:

print("n:") ; n = int(input())
if n==1: print("Unidade")
elif(n  >=0):
   if(n% 3): print("Deixa resto")
   else:    print("Não deixa")
else: print("Negativo")

Bem:

n = int(input("n:"))
if n == 1:
    print("Unidade")
elif n >= 0:
    if n % 3 == 1:
        print("Deixa resto")
   	else:
        print("Não deixa")
else:
    print("Negativo")

Um pouco de maniqueísmo - Nome de variáveis

Mal:

exercises = int(input())
n1 = float(input())
n3 = float(input())
n2 = 4.0
n4 = 6.0
if exercices > 7:
    n4 = 7.0
aluno = (n1*n2 + n3*n4)/10
print(aluno)

Bem:

exercicios = int(input())
nota1 = float(input())
nota2 = float(input())
peso1 = 4.0
peso2 = 6.0
if exercicios > 7:
    peso2 = 7.0
media = (nota1*peso1 + nota2*peso2)/10
print(media)

Um pouco de maniqueísmo - Documentação

Mal:

r = float(input())
v = (4.0*3.1425*r*r*r)/3.0
print(v)

Mal:

'''
Calcula o volume de uma esfera.

Lê o raio de uma esfera pelo
teclado e imprime na tela o
volume correspondente.

ENTRADA:
    - o raio da esfera
SAÍDA:
    - o volume da esfera
PRÉ-CONDIÇÃO:
    - O raio deve ser maior que zero.
AUTOR: Joãozinho
'''

PI = 3.1415

r = float(input())
v = (4.0*PI*r*r*r)/3.0;
print(v)
  1. Escolhendo um estilo de programação

    a) Não existe um jeito certo de escrever código: cada programador adota um estilo diferente, o importante é manter-se consistente. Pesquise sobre a importância da legibilidades de programas de computador: posição das chaves, indentação, uso de espaço, etc. Depois reflita e disserte brevemente sobre o seguinte tema: “Um código é escrito só uma vez, mas é lido diversas vezes”.

    b) Manter o código organizado pode ser trabalhoso, especialmente para programadores iniciantes. Mas felizmente o existem ferramentas que ajudam nessa tarefa. Pesquise e experimente ferramentas de formatação automática de códigos, como plugins ou extensões de editores de texto e IDEs.

Exercícios criativos

  1. O histograma de um conjunto de dados é um gráfico da frequência com que cada valor aparece. Escreva um programa que leia uma lista de tamanho informado pelo usuário e com valores inteiros entre 1 e 9 e imprima o histograma na mesma forma que o exemplo: para uma lista de tamanho 20 com os valores 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 6, 7, 8, 8, 8, 9, 9, 9, 9, 9 deverá imprimir:

    +---------+
    |        *|
    |*       *|
    |**     **|
    |***    **|
    |**** ****|
    +---------+
     123456789
    
  2. No exemplo dos números primos visto em aula, não precisamos testar todos os números entre $2, \dots, (n−1)$, para verificar se dividem ou não $n$. Basta testarmos até $n/2$. Por quê? Qual o maior divisor possível de $n$? Na verdade, basta testarmos os números $2,\dots, \sqrt{n}$. Por quê?

  3. Lidando com os casos especiais: Algumas vezes, um algoritmo “funciona” para vários casos, mas não para todos. Esses casos “problemáticos” geralmente são casos especias, que devem ser tratados individualmente, como o primeiro ou o último elemento de uma lista, etc. Por exemplo, os dois primeiros elementos da sequência de Fibonacci são calculados de maneira especial. Similarmente, para descobrir o menor número de uma lista, começamos com o primeiro ou o último elemento e comparamos com os demais. Por esse motivo, sempre nos lembremos dos possíveis casos especiais!

    Suponha que existam $n$ lâmpadas numeradas ordenadamente. Elas estão ligadas em um circuito de tal modo que toda vez que uma lâmpada é acesa ou apagada, outras lâmpadas podem são apagadas ou acendidas. Quando uma lâmpada é

    • ACENDIDA, as posteriores invertem.
    • APAGADA, as anteriores invertem.

    Inicialmente:

    Lâmpada 3 acendida:

    Lâmpada 4 apagada:

    a) Escreva um programa que receba

    • o número de lâmpadas, $n$, de um circuito como no anterior,
    • um índice de uma lâmpada específica, $k$, que deverá ficar acesa.

    O programa deve instruir o usuário a acender ou apagar lâmpadas para que, no final, apenas a lâmpada de número $k$ fique acesa. Para acender uma lâmpada de número XX , imprima “Acender lampada XX” e, para apagar uma lâmpada de número XX, imprima “Apagar lampada XX”

    b) Modifique o programa anterior para receber

    • o número de lâmpadas, $n$, de um circuito como no anterior,
    • o número de lâmpadas que devem ficar acesas, $m$,
    • uma lista de $m$ índices de lâmpadas que devem ficar acesas.

    No final, apenas as lâmpadas listadas devem permanecer acesas.

    c) Verifique se o seu programa está correto. Para isso, verifique se existe algum caso especial. Faça um teste de mesa se necessário.