Buscar

Introdução à Programação - Poli - Psub - em Python - 2013

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Departamento de Ciência da Computação - IME - USP
MAC2166 Introdução à Computação
Escola Politécnica - Primeiro Semestre de 2013
Prova Substitutiva
QUESTÃO 1
 Um caixa de banco tem somente notas de a e b reais para fornecer aos seus clientes. Quando um cliente
chega com um cheque no valor de c reais, o caixa precisa fazer umas contas para decidir se é possível descontar
o cheque ou não.
 Escreva um programa que resolva o problema do caixa de banco: o programa lê do teclado 3 inteiros positivos
a, b e c e imprime TODAS as combinações possíveis de notas de a reais e notas de b reais, totalizando c reais,
ou uma mensagem informando que não é possível descontar o cheque.
Exemplos:
Para a = 5, b = 3 e c = 11 seu programa deve imprimir:
 1 notas de 5 e 2 notas de 3 
Para a = 3, b = 5 e c = 30 seu programa deve imprimir:
 10 notas de 3 e 0 notas de 5
 5 notas de 3 e 3 notas de 5
 0 notas de 3 e 6 notas de 5 
Para a = 5, b = 3 e c = 7 seu programa deve imprimir:
 Não é possível descontar o cheque 
Para a = 4, b = 6 e c = 121 seu programa deve imprimir:
 Não é possível descontar o cheque 
Para a = 4, b = 7 e c = 127 seu programa deve imprimir:
 2 notas de 4 e 17 notas de 7
 9 notas de 4 e 13 notas de 7
 16 notas de 4 e 9 notas de 7
 23 notas de 4 e 5 notas de 7
 30 notas de 4 e 1 notas de 7 
Para a = 6, b = 15 e c = 199 seu programa deve imprimir:
 Não é possível descontar o cheque 
UMA SOLUÇÃO
#--------------------------------------------------------------------
# SOLUÇÃO 1: 
# 
#--------------------------------------------------------------------
def main():
 '''
 Programa que lê valores de notas a e b e o valor c de um cheque
 e imprime todas as maneiras possíveis de se descontar o cheque
 com notas de a e b.
 Se não for possível descontar o cheque o programa imprime
 "Nao é possivel descontar o cheque".
 '''
 
 a = int(input("Digite o valor de a: "))
 b = int(input("Digite o valor de b: "))
 c = int(input("Digite o valor do cheque: "))
 # indica se é possível descontar o cheque 
 possível = False
 # número máximo de notas de a
 max_a = c // a
 # número máximo de notas de b
 max_b = c // b
 
 # para cada número possível n_a de notas de a
 for n_a in range(max_a+1):
 
 # para cada número possível n_b de notas de b 
 for n_b in range(max_b+1):
 # verifique se é possível descontar o cheque de valor c
 # com n_a notas de a e n_b notas de b 
 if n_a*a + n_b*b == c:
 print("%d notas de %d e %d notas de %d" %(n_a,a,n_b,b))
 # print(n_a, "notas de", a, "e", n_b, "notas de", b) 
 possível = True
 
 if not possível: # equivalente a possível == False
 print("Nao é possivel descontar o cheque")
main()
#--------------------------------------------------------------------
# SOLUÇÃO 2: 
# 
#--------------------------------------------------------------------
def main():
 '''
 Programa que lê valores de notas a e b e o valor c de um cheque
 e imprime todas as maneiras possíveis de se descontar o cheque
 com notas de a e b.
 Se não for possível descontar o cheque o programa imprime
 "Nao é possivel descontar o cheque".
 '''
 
 a = int(input("Digite o valor de a: "))
 b = int(input("Digite o valor de b: "))
 c = int(input("Digite o valor do cheque: "))
 # indica se é possível descontar o cheque 
 possível = False
 # número máximo de notas de a
 max_a = c // a
 # número máximo de notas de b
 max_b = c // b
 
 # para cada número possível n_a de notas de a
 n_a = 0
 while n_a <= max_a:
 
 # para cada número possível n_b de notas de b
 n_b = 0
 while n_b <= max_b:
 # verifique se é possível descontar o cheque de valor c
 # com n_a notas de a e n_b notas de b 
 if n_a*a + n_b*b == c:
 print("%d notas de %d e %d notas de %d" %(n_a,a,n_b,b))
 # print(n_a, "notas de", a, "e", n_b, "notas de", b) 
 possível = True
 
 n_b += 1
 n_a += 1
 
 if not possível: # equivalente a possível == False
 print("Nao é possivel descontar o cheque")
main()
#--------------------------------------------------------------------
# SOLUÇÃO 3: 
# 
#--------------------------------------------------------------------
def main():
 '''
 Programa que lê valores de notas a e b e o valor c de um cheque
 e imprime todas as maneiras possíveis de se descontar o cheque
 com notas de a e b.
 Se não for possível descontar o cheque o programa imprime
 "Nao é possivel descontar o cheque".
 '''
 
 a = int(input("Digite o valor de a: "))
 b = int(input("Digite o valor de b: "))
 c = int(input("Digite o valor do cheque: "))
 # indica se é possível descontar o cheque 
 possível = False
 # para cada número possível n_a de notas de a
 n_a = 0
 while c >= 0:
 
 # é possível descontar c nom n_a notas de a?
 if c % b == 0:
 n_b = c // b
 print("%d notas de %d e %d notas de %d" %(n_a,a,n_b,b))
 # print(n_a, "notas de", a, "e", n_b, "notas de", b) 
 possível = True
 
 c -= a 
 n_a += 1 
 if not possível: # equivalente a possível == False
 print("Nao é possivel descontar o cheque")
main() 
QUESTÃO 2
 Escreva um programa que leia do teclado um número inteiro n > 0 e uma sequência de n números reais
e imprima uma tabela mostrando os números que compõem a sequência e o número de vezes que cada um
deles ocorre na mesma.
 Exemplo para a entrada:
 8 -1.7 3.0 0.0 1.5 0.0 -1.7 2.3 -1.7
a saída deve ser:
 -1.7 ocorre 3 vezes 
 3.0 ocorre 1 vezes 
 0.0 ocorre 2 vezes 
 1.5 ocorre 1 vezes 
 2.3 ocorre 1 vezes 
UMA SOLUÇÃO
#--------------------------------------------------------------------
# SOLUÇÃO 1: Versão com função auxiliar
# 
#--------------------------------------------------------------------
def main():
 '''
 Dados n e uma sequência com n números reais, 
 conta e imprime o número de vezes que cada número ocorre
 na sequência.
 '''
 n = int(input("Digite o tamanho da sequencia: "))
 # armazena os números que ocorrem na sequência
 lista = []
 # contador do número de vezes que cada número ocorre na sequência
 # n_ocorrências[i] == número de vezes que lista[i] ocorre na sequência
 n_ocorrências = []
 
 for i in range(n):
 x = float(input("Digite um número: "))
 j = insere_novo(x,lista)
 # é a primeira vez que x ocorre na sequência?
 if j > len(n_ocorrências)-1:
 # sim, é a primeira vez
 n_ocorrências.append(1)
 else:
 # não, x já havia ocorrido e x == lista[j]
 n_ocorrências[j] += 1
 print(" Número no. ocorrências")
 for i in range(len(lista)):
 print("%10.2f %6d" %(lista[i],n_ocorrências[i]))
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
def insere_novo(x, lista):
 '''(float, list) -> int
 Recebe um float 'x' e uma lista 'lista' e retorna o
 índice da posição em que x ocorre na lista.
 Caso x não ocorra na lista ele é inserido no final e
 o índice dessa posição é retornado.
 '''
 # número de elementos na lista
 n = len(lista)
 # procure x na lista
 for i in range(n):
 if x == lista[i]:
 return i
 # insira x na lista
 lista.append(x)
 return n
main()
#--------------------------------------------------------------------# SOLUÇÃO 2: Versão sem função 
# 
#--------------------------------------------------------------------
def main():
 '''
 Dados n e uma sequência com n números reais, 
 conta e imprime o número de vezes que cada número ocorre
 na sequência.
 '''
 n = int(input("Digite o tamanho da sequencia: "))
 # armazena os números que ocorrem na sequência
 lista = []
 # contador do número de vezes que cada número ocorre na sequência
 # n_ocorrências[i] == número de vezes que lista[i] ocorre na sequência
 n_ocorrências = []
 
 for i in range(n):
 # leia o próximo número da sequência
 x = float(input("Digite um número: "))
 # verifique que x já está na lista 
 achou = False
 j = 0
 m = len(lista)
 while j < m and not achou: # "not achou" é equivalente a "achou == False"
 if x == lista[j]:
 achou = True
 else:
 j += 1
 
 if achou: # se achou == True então que x == lista[j]
 # incremente o número de ocorrências
 n_ocorrências[j] += 1
 
 else: # é a primeira ocorrência de x na sequência
 # insira x na lista
 lista.append(x)
 # inicialize o contador de ocorrências do novo elemento
 n_ocorrências.append(1)
 
 print(" Número no. ocorrências")
 for i in range(len(lista)):
 print("%10.2f %6d" %(lista[i],n_ocorrências[i]))
main()
#--------------------------------------------------------------------
# SOLUÇÃO 3: Versão que lê a sequência inteira e só depois
# calcula o número de ocorrências
# 
#--------------------------------------------------------------------
def main():
 '''
 Dados n e uma sequência com n números reais, 
 conta e imprime o número de vezes que cada número ocorre
 na sequência.
 '''
 n = int(input("Digite o tamanho da sequencia: "))
 # 1 leia todos os números da sequência
 sequência = [] # armazenará, iniciamente, toda a sequência de floats
 for i in range(n):
 sequência[i] = float(input("Digite o %do. número da sequência" %(i+1))
 # 2 conte e imprima o número de ocorrência de cada número na sequência
 print(" Número no. ocorrências")
 i = 0
 while i < n:
 n_ocorrências = 1
 x = sequência[i]
 # percorra a sequência a partir da posição de índice i+1
 # contando e removendo as ocorrências de x
 j = i+1
 while j < n:
 if x == sequência[j]:
 n_ocorrências += 1
 # "remova" o elemento sequência[j]
 sequência[j] = sequência[n-1]
 # diminua o tamanho da sequência
 n = n - 1
 else:
 j = j + 1
 # imprima x e o número de ocorrências
 print("%10.2f %6d" %(x, n_ocorrências))
 # vamos examinar o próximo elemento
 i = i + 1
main()
#--------------------------------------------------------------------
# SOLUÇÃO 4: Versão lê a sequência inteira de uma vez 
# 
#--------------------------------------------------------------------
def main():
 '''
 Dados n e uma sequência com n números reais, 
 conta e imprime o número de vezes que cada número ocorre
 na sequência.
 '''
 n = int(input("Digite o tamanho da sequencia: "))
 # 1 leia todos os números da sequência
 sequência_str = input("Digite uma sequência com %d números: " %n)
 # 2 converta a string para uma lista de strings em que cada
 # elemento é um string que representa um número float
 lista_str = sequência_str.split()
 # linhas a seguir não fazem parte da solução 
 if n != len(lista_str):
 print("Opsss, tem problema com o número de elementos da sequência")
 return None # fui 
 # 3 converta cada string da lista para float
 sequência = [] # armazenará, iniciamente, toda a sequência de floats 
 for num_str in lista_str:
 num_float = float(num_str)
 sequência.append(num_float)
 # 4 conte e imprima o número de ocorrência de cada número na sequência
 print(" Número no. ocorrências")
 i = 0
 while i < n:
 n_ocorrências = 1
 x = sequência[i]
 # percorra a sequência a partir da posição de índice i+1
 # contando e removendo as ocorrências de x
 j = i+1
 while j < n:
 if x == sequência[j]:
 n_ocorrências += 1
 # "remova" o elemento sequência[j]
 sequência[j] = sequência[n-1]
 # diminua o tamanho da sequência
 n = n - 1
 else:
 j = j + 1
 # imprima x e o número de ocorrências
 print("%10.2f %6d" %(x, n_ocorrências))
 # vamos examinar o próximo elemento
 i = i + 1
main()
QUESTÃO 3
 Os elementos aij de uma matriz de números reais An×n representam os custos de transporte da cidade
i$ para a cidade j. Um itinerário que percorre k cidades é representado por uma lista C com k inteiros.
Nesta questão vamos resolver o problema de calcular custos de itinerários entre as cidades, para achar o
itinerário mais barato.
 Por exemplo, para A4×4,
A 0 1 2 3
0 14.8 2.9 7.5 8.9
1 5.3 8.4 18.014.8
2 2.3 21.7 3.9 8.7
3 7.3 12.143.757.8
o itinerário entre k = 9 cidades, representado pela lista
0 1 2 3 4 5 6 7 8
C 0 3 1 3 3 2 1 0 2
tem custo
= a03 + a31 + a13 + a33 + a32 + a21 + a10 + a02 
= 8.9 + 12.1 + 14.8 + 57.8 + 43.7 + 21.7 + 5.3 + 7.5 
= 171.8
e o itinerário entre k = 1 cidade, representado pela lista
0
C 2
tem custo zero.
item (a)
Escreva uma função custo com cabeçalho:
 def custo(A, C):
que recebe uma matriz A de números reais de dimensão n × n, n > 0, e uma lista C com k > 0 números
inteiros. A função deve retornar o custo do itinerário entre as k cidades.
UMA SOLUÇÃO
def custo(A, C):
 ''' (matriz, list) -> float
 Recebe uma matriz quadrada A de custos de transporte e uma lista C representado
 um itinerário e retorna o custo do itinerário.
 '''
 # comprimento do itinerário
 k = len(C)
 custo_itinerário = 0
 for i in range(k-1):
 origem = C[i] # cidade origem
 destino = C[i+1] # cidade destino 
 custo_itinerário += A[origem][destino]
 return custo_itinerário
 
item (b)
Escreva um programa que:
leia o nome de um arquivo que contém uma matriz de reais A (matriz de custos),
leia um número inteiro m, m > 0,
leia m itinerários; cada itinerário consiste de uma sequência de k números inteiros, onde k > 0,
representando as cidades (ou seja, o programa deve ler do teclado o valor de k e uma sequência de k
inteiros),
para cada um dos m itinerários o seu programa deve imprimir o seu custo.
ao final, o programa deve imprimir o custo do itinerário mais barato e a sequência de cidades desse
itinerário.
O seu programa deve, utilizar a função custo do item anterior, mesmo que não a tenha implementado. Além
da função custo você pode utlizar a função com cabeçalho:
 def le_matriz(nome_do_arquivo):
sem implementá-la. A função le_matriz recebe o nome de um arquivo e retorna uma matriz de números
reais.
Por exemplo para
A 0 1 2 3
0 14.8 2.9 7.5 8.9
1 5.3 8.4 18.014.8
2 2.3 21.7 3.9 8.7
3 7.3 12.143.757.8
m = 3,
itinerário 1, k = 3, 0 1 2 tem custo 20.9 (= 2.9 + 18.0)
itinerário 2, k = 2, 2 1 tem custo 21.7
itinerário 3, k = 4, 2 3 0 1 tem custo 25.0 ( =14.8 + 7.3 + 2.9 )
A saída do programa deve ser:
O itinerário mais barato tem custo 20.9 e passa pelas cidades: 0 1 2 
UMA SOLUÇÃO
def main():
 '''
 Programa para o cálculo de um itinerário de menor custo
 '''
 # 1 leiao nome do arquivo
 nome_arquivo = input("Digite o nome do arquivo com a matriz de custos: ")
 # 2 leia a matriz de custos
 A = leia_matriz(nome_arquivo)
 # 3 leia o número e itinerários
 m = int(input("Digite o número de itinerários: "))
 # 4 leia o primeiro itinerário e calcule o seu custo
 # o primeiro é o mais barato até que se prove o contrário
 itinerário_barato = leia_itinerário()
 menor_custo = custo(A, itinerário_barato)
 print("Custo do 1o. itinerário é %f" %(menor_custo))
 
 # 5 leia cada um dos demais itinerário, calcule o seu custo 
 # e mantenha o itinerário mais barato até o momento
 for i in range(m-1):
 # leia o itinerário
 itinerário = leia_itinerário()
 # calcule e imprima o seu custo
 custo_itinerário = custo(A, itinerário)
 print("Custo do %do. itinerário é %f" %(i+2,custo_itinerário))
 # verifique se este itinerário é o mais barato até o momento
 if custo_itinerário < menor_custo:
 menor_custo = custo_itineráreo
 itinerário_barato = itinerário
 # 6 imprima o itinerário mais barato
 print("O itinerário mais barato tem custo %f e passa pelas cidades:" %(menor_custo))
 for cidade in itinerário_barato:
 print(cidade)
#--------------------------------------------------------------------------
def leia_itinerário():
 ''' (None) -> list
 Função que lê um itinerário do teclado e cria uma lista com esse itinerário.
 A função retorna a lista criada.
 '''
 k = int(input("Digite o número de cidades no itinerário: "))
 itinerário = []
 for i in range(k):
 cidade = int(input("Digite a %da. cidade do itinerário: " %(i+1)))
 itinerário.append(cidade)
 return itinerário
#-----------------------------------------------------------------------
main()
 
 
 
Last modified: Fri Jul 12 19:50:46 BRT 2013
	MAC2166 Introdução à Computação
	Escola Politécnica - Primeiro Semestre de 2013
	Prova Substitutiva
	QUESTÃO 1
	QUESTÃO 2
	QUESTÃO 3

Outros materiais