Listas
-
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.
-
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.
-
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.
-
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.
-
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]$.
-
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.
-
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
-
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.
-
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.
-
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
-
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.
-
Faça um algoritmo para calcular e escrever o fatorial de um determinado número lido.
-
Faça um programa que lê um número $n$ e crie uma lista de todos divisores de $n$ entre $2$ e $n - 1$.
-
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ê?
-
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.
-
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}$.
-
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
-
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:
- Comentários que resumem o que faz um conjunto de comandos.
- Formatação bem definida (indentação, espaçamentos, nomes)
- Documentação adequada de cada programa ou algoritmo.
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)
- O que esse programa faz?
- O valor de $\pi$ está errado, com quem eu falo?
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)
-
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
-
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
-
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ê?
-
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.