Você está na página 1de 6

MAC 110 - Introdução à Computação

Primeiro Semestre de 2019– BMAC – IMEUSP - Prof.Marcilio


Prova 2 – 19/Junho/2019

Questão 1 2 3 4 5 6 Total
Valor 1 1 2 2 2 2 10
Nota

Nome:____________________________________________________ NUSP:________________

Questão 1 – 1 Ponto

Considere a seguinte tabela (lista) de 15 elementos e conteúdo crescente (v[i] ≤ v[i+1]).

I 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
v[i] 2.2 3.4 3.4 4.8 8.1 15.0 15.0 18.3 27.8 33.5 45.2 45.2 56.7 67.4 88.9

Usando o algoritmo de busca binária, diga com quantos números haverá comparação para se
procurar nesta tabela os seguintes valores:

a) O valor 4.8

2 comparações – compara com 18.3 em seguida com 4.8

b) O valor 56.7

4 comparações – compara com 18.3, 45.2, 67.4 e com 56.7

c) O valor 12.3

4 comparações – compara com 18.3, 4.8, 15.0 e com 8.1

d) O valor 99.5

4 comparações – compara com 18.3, 45.2, 67.4, 88.9

e) Qual o máximo número de comparações com elementos da tabela acima, para se encontrar
ou concluir que o elemento não está?

4 comparações
Questão 2 – 1 Ponto:

As funções abaixo recebem uma lista lista e um valor x e devolvem uma nova lista com o
mesmo conteúdo, eliminando todas as ocorrências de x.
Diga quais delas estão certas e quais estão erradas.

a) Errada – a lista vai diminuindo de tamanho a cada del, mas o


comando for sempre vai percorrer a lista com o tamanho original.

def Elimina(lista, x):


nova = lista[:]
for k in range(len(nova)):
if nova[k] == x: del(nova[k])
return nova

b) Certa

def Elimina(lista, x):


nova = []
for k in range(len(lista)):
if lista[k] != x:
nova.append(lista[k])
return nova

c) Certa

def Elimina(lista, x):


nova = lista[:]
k = 0
while k < len(nova):
if nova[k] == x: del(nova[k])
else: k = k + 1
return nova

d) Certa

def Elimina(lista, x):


nova = []
for s in lista:
if s != x: nova.append(s)
return nova

e) Certa

def Elimina(lista, x):


nova = lista[:]
k = 0
while k < len(nova):
if nova[k] == x: nova = nova[:k] + nova[k+1:]
else: k = k + 1
return nova
Questão 3 – 2 Pontos:

Dado um arquivo de texto arquivo1.txt. Cada linha contém 3 campos separados por vírgula.
Faça um programa que crie um arquivo arquivo2.txt colocando cada campo numa nova linha.
Exemplo:

arquivo1.txt (arquivo dado):

132.333.433-38,Gerson Saldiva Santos,Rua Saldanha da Gama 135 - Apto 104


187.364.832-23,Martinho da Vila Isabel,Rua Santa Terezinha 1234 - Fundos
342.598.155-56,Antonio Antares Longe,Rua Cabral de Mello Antunes 333

arquivo2.txt (arquivo criado):

132.333.433-38
Gerson Saldiva Santos
Rua Saldanha da Gama 135 - Apto 104
187.364.832-23
Martinho da Vila Isabel
Rua Santa Terezinha 1234 - Fundos
342.598.155-56
Antonio Antares Longe
Rua Cabral de Mello Antunes 333

# abrir arquivo de entrada


arq1 = open("arquivo1.txt", "r")
# abrir arquivo de saida
arq2 = open("arquivo2.txt", "w")
# percorre arq1 linha a linha
for linha in arq1:
# quebra em elementos - a vírgula é o separador
lista = linha.split(',')
# grava registros 1 e 2 com o fim de linha
arq2.write(lista[0] + '\n')
arq2.write(lista[1] + '\n')
# o registro 3 já tem o fim de linha do original
arq2.write(lista[2])
# fecha os 2 arquivos
arq1.close()
arq2.close()
Questão 4 – 2 Ponto:

a) Escreva uma função TestaVizinhos(mat, n, i, j) que recebe como parâmetros uma


matriz mat quadrada (n linhas por n colunas), dois inteiros i e j (0 ≤ i, j < n) e verifica
se o elemento mat[i][j], está cercado por zeros. Ou seja, se seus vizinhos na horizontal ou
vertical são zeros. Devolve True ou False. Exemplo: Na matriz abaixo, o 3, 4 e 6 tem apenas
vizinhos zero.

3 0 0 1
0 0 0 2
0 4 0 5
6 0 0 7

def TestaVizinhos(mat, n, i, j):


# vizinho da esquerda
if j > 0 and mat[i][j - 1] != 0: return False
# vizinho da direita
if j < n - 1 and mat[i][j + 1] != 0: return False
# vizinho de cima
if i > 0 and mat[i - 1][j] != 0: return False
# vizinho de baixo
if i < n - 1 and mat[i + 1][j] != 0: return False
# todos os vizinhos são zero
return True

b) Escreva uma função TestaMatriz(mat, n) que recebe como parâmetros uma matriz mat
quadrada (n linhas por n colunas) e devolve uma lista de duplas com os índices dos elementos
que estão cercados por zeros. Use obrigatoriamente a função TestaVizinhos acima.
Exemplo: No caso acima devolver a lista:

[(0, 0), (2, 1), (3, 0)]

def TestaMatriz(mat, n):


result = []
for lin in range(n):
for col in range(n):
if TestaVizinhos(mat, n, lin, col):
# adiciona nova dupla
result.append((lin, col))
# retorna a lista de duplas
return result
Questão 5 – 2 Pontos:

Escreva uma função SomaSerie(x, eps)que recebe um valor float x > 0 e um outro valor
float eps > 0 bem pequeno (por exemplo 0.001) e devolve o valor da soma abaixo. A soma deve
ser calculada até o último termo que seja maior que eps.
Não usar as funções fatorial e pow e também a operação de exponenciação (**). Ou seja, as
potências de 2 e o fatorial tem que ser calculados por multiplicações sucessivas.

𝑥 + 2 𝑥 + 22 𝑥 + 23 𝑥 + 24 𝑥 + 2𝑘
+ + + + ⋯+ +⋯
1! 2! 3! 4! 𝑘!

def SomaSerie(x, eps):


pot2 = 2
fat = 1
k = 1
soma = 0.0
while (x + pot2) / fat > eps:
# mais uma parcela
soma = soma + (x + pot2) / fat
# prepara a próxima parcela
pot2 = pot2 * 2
k = k + 1
fat = fat * k
# retorna valor calculado
return soma
Questão 6 – 2 Pontos

Considere a seguinte função recursiva que recebe como parâmetro uma lista L:

def func(L):
if len(L) <= 1: return True
if L[0] <= L[1]: return func(L[1:])
else: return False

a) Diga o que será impresso pelos comandos abaixo:

print(func([7]))

True

print(func([7, 9, 13]))

True

print(func([7, 9, 9, 17]))

True

print(func([7, 9, 17, 13]))

False

b) Escreva uma função não recursiva equivalente à função acima.

Essa função devolve:


 True se os elementos da lista estão em ordem crescente (L[i] ≤ L[i+1])
 False caso contrário.

def funceq(L):
for k in range(1, len(L)):
if L[k - 1] > L[k]: return False
# varreu a lista L e L[k] <= L[k + 1]
return True

Você também pode gostar