MAC2166 Introdução à Computação

Documentos relacionados
Python. Resumo e Exercícios P3

MAC2166 Introdução à Computação

MAC2166 Introdução à Computação

MAC2166 Introdução à Computação

Python. Resumo e Exercícios P2 Parte 1

DURAÇÃO DA PROVA: 2 horas

INTRODUÇÃO À COMPUTAÇÃO - RESUMO E EXERCÍCIOS* P2

Computação 1 - Python Aula 12 - Teórica: Interação com o usuário e programa principal. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 25

FUNDAMENTOS DA PROGRAMAÇÃO 2º Teste, 1 de junho de 2013, 1h30m

Computação 1 - Python Aula 11 - Teórica. programa principal. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 29

Introdução à Computação - aulas 01 e 02 -

1. Uma função é um módulo (subprograma) que realiza uma tarefa específica. 3. Ao chamar uma função, passamos argumentos, no mínimo 0 e no máximo n.

Prova Final de Linguagens de Programação - DCC024B -

Prova 2. CI208 - Programação de Computadores. Nome: 1 o semestre Instruções para a prova

PROGRAMAÇÃO DE COMPUTADORES I BCC Aula Prática 15

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

MAC 2166 Introdução à Computação para Engenharia Escola Politécnica Primeiro Semestre de 2003 Primeira Prova 2 de abril de 2003

Prova 1 QUESTÃO 1. (1) nusp % 3 == 1. MAC2166 Introdução à Computação para a Engenharia. # include <stdio.h>

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Estruturas de Dados. Túlio Toffolo BCC402 Aula 02 Algoritmos e Programação Avançada

Aula 1 - Revisão de Modularização

Computação 1 - Python Aula 10 - Teórica: Estrutura de Dados - Dicionário. João Carlos, Carla Delgado, Ana Luisa Duboc 1/ 18

Processamento da Informação Teoria. Exercícios sobre strings

Fundamentos da Programação

(Sistema Especialista)

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Estrutura de Dados. Diego Silveira Costa Nascimento

Computação II (MAB 225)

Um Minotauro Perdido & Percolação

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

*Exercícios de provas anteriores escolhidos para você estar preparado para qualquer questão na prova. Resoluções em simplificaaulas.

Questão 1 Exemplo de execução 1 (com N=6): Exemplo de execução 2 (com N=4):

Processamento da Informação Teoria. Desvio Condicional

MAC 115 Introdução à Ciência da Computação ROTHELO

Fundamentos de Lógica e Algoritmos. Aula 3.2 IDLE, Variáveis e Tipos. Prof. Dr. Bruno Moreno

Fundamentos da Programação

Algoritmos e Estrutura de Dados Aula 02 Listas em Python

1.Quais serão os valores de x, y e p ao final do trecho de código abaixo? int x, y, *p;y = 0; p = &y; x = *p; x = 4; (*p)++; --x; (*p) += x;

Fundamentos da Programação

1. Considere a seguinte lista de dicionários na qual os significados dos campos são óbvios:

Computação 1 - Python Aula 7 - Teórica: Estrutura de Repetição com teste de parada: while 1/ 23

5ª Lista de Exercícios de Programação I

Lista de Exercícios - 1 Prof: Yuri Frota

VETORES. Lista de Exercícios Vetores Prof: Yuri Frota

Programação com objectos

Introdução a Programação

Listas e Tuplas. Vanessa Braganholo

EP 2 - MAC 2166 Uma solução comentada

Exercícios de Funções (6 14): """ Exercício 6

Fundamentos de Programação em Python

Aula 18: Vetores Introdução a Programação Túlio Toffolo & Puca Huachi

Passo-a-passo para desenvolver um Programa usando a Linguagem Python

Matrizes. Vanessa Braganholo

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

SME Introdução à Programação de Computadores Primeiro semestre de Trabalho: jogo Semáforo

Exercícios: Vetores e Matrizes

Fundamentos da Programação

SCC0124 Introdução à Programação para Engenharias

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

2º Lista de Exercícios Arrays e matrizes

EXPLORANDO GRAFOS 1. Grafos e Jogos uma introdução

Lista de Exercícios 3 Laço de Repetição For e While

Transcrição:

Departamento de Ciência da Computação IME USP MAC2166 Introdução à Computação Escola Politécnica Primeiro Semestre de 2015 Prova Substitutiva QUESTÃO 1 Esta questão consiste na implementação de duas funções em Python. Uma das funções é o main() e a outra é uma função de nome lecker(). Dizemos que uma lista de números inteiros é lecker se ela tem apenas 1 elemento que é maior que seus vizinhos. Por exemplo, Item (a) [2, 5, 10, 46, 25, 12, 7] é lecker, pois 46 é único elemento que é maior que seus vizinhos, que são 10 e 25. [13, 5, 4, 2, 3, 0, 3, 14] não é lecker, porque 13 é maior que 5 (5 é o único vizinho do 13) e 3 é maior que 2 e 0 (2 e 0 são os vizinhos do 3); [6, 7, 8, 9, 10] é lecker, pois apenas 10 é maior que seus vizinhos (9 é o único vizinho do 10). [7, 6] é lecker, pois apenas 7 é maior que seus vizinhos (6 é o único vizinho de 7). [16, 16, 16] não é lecker, pois nenhum elemento é maior que seus vizinhos. [23] não é lecker, pois nenhum elemento é maior que seus vizinhos (23 não tem vizinhos). Escreva uma função lecker() que recebe uma lista de números e retorna True se a lista é lecker e False em caso contrário. def lecker(lista): '''(list) > bool Recebe uma lista e retorna True se ela é lecker. Uma lista de número é lecker se tem apenas 1 "máximo local". ''' n = len(lista) # lista muito pequena tratamos na mão if n == 1: return False # número de máximos locais no_máximos = 0 # verifique o início esquerdo da lista if lista[0] > lista[1]: no_máximos += 1 # verifique o meio da lista for i in range(1,n 1): if lista[i 1] < lista[i] and lista[i] < lista[i+1]: no_máximos += 1 # verifique o final da lista if lista[n 1] > lista[n 2]: no_máximos += 1 Item (b) return no_máximos == 1 Uma matriz é lecker se cada uma das listas formada por linhas da matriz e cada uma das listas formada por colunas da matriz forem lecker. Por exemplo, número de linhas = 3 número de linhas = 3 número de linhas = 4 número de linhas = 4 número de colunas = 4 número de colunas = 4 número de colunas = 3 número de colunas = 3 matriz: matriz: matriz: matriz: https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 1/6

1 2 3 4 1 2 3 5 1 2 3 1 2 3 8 7 6 5 8 7 6 4 5 8 7 5 8 7 9 10 11 12 9 10 11 12 6 4 9 6 9 13 A matriz é lecker! A matriz não é lecker! 10 11 12 10 11 12 A matriz não é lecker! A matriz é lecker! Escreva uma função main() que leia inteiros n_lin e n_col, 0 < n_lin, n_col, e uma matriz de números inteiros com n_lin linhas e n_col colunas e imprime uma mensagem indicando se a matriz é ou não lecker. Utilize obrigatoriamente a função lecker() do item anterior mesmo que você não a tenha feito. A seguir está um exemplo de execução da função main(). O seu programa pode utilizar sem escrevê la uma função imprima_matriz() que recebe uma matriz e a imprime como mostrado no exemplo de execução. Verificador de leckerdesa Digite o número de linhas da matriz: 3 Digite o número de colunas da matriz: 4 Digite o elemento [0][0]: 1 Digite o elemento [0][1]: 2 Digite o elemento [0][2]: 3 Digite o elemento [0][3]: 5 Digite o elemento [1][0]: 8 Digite o elemento [1][1]: 7 Digite o elemento [1][2]: 6 Digite o elemento [1][3]: 4 Digite o elemento [2][0]: 9 Digite o elemento [2][1]: 10 Digite o elemento [2][2]: 11 Digite o elemento [2][3]: 12 número de linhas = 3 número de colunas = 4 1 2 3 5 8 7 6 4 9 10 11 12 A matriz não é lecker! def main(): ''' Programa que verifica se uma dada matriz de números é lecker. ''' print("verificador de leckerdesa") # 1 leia as dimensões da matriz n_lin = int(input("digite o número de linhas da matriz: ")) n_col = int(input("digite o número de colunas da matriz: ")) # 2 leia os elementos e crie a matriz matriz = [] for i in range(n_lin): linha = [] for j in range(n_col): num = int(input("digite o elemento [%d][%d]: " %(i,j))) linha.append(num) matriz.append(linha) # 3 imprima a matriz imprima_matriz(matriz) # 4 a matriz é lecker até que se prove o contrário é_lecker = True # 5 verifique se as linhas são lecker i = 0 while i < n_lin and é_lecker: é_lecker = lecker(matriz[i]) i += 1 # vá para a próxima linha # 6 verifique se as colunas são lecker j = 0 while j < n_col and é_lecker: # copie a coluna para uma lista coluna = [] for i in range(n_lin): coluna.append(matriz[i][j]) https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 2/6

é_lecker = lecker(coluna) j += 1 # vá para a próxima coluna # 7 imprima o veredicto if é_lecker: print("a matriz e lecker!") else: print("a matriz não é lecker!") QUESTÃO 2 Nesta questão você escreverá um programa em Python que simula uma partida de uma versão simplificação de um jogo de cartas chamado War. (Esse jogo foi desenvolvido para muitas plataformas, incluindo Android, Apple IOS e Windows Phones. Como não há decisões no jogo e o resultado é totalmente aleatório, War não é considerado um jogo segundo algumas definições [Wikipedia].) War é um jogo entre dois jogadores. No início de uma partida de War as cartas de um baralho são embaralhadas. Em seguida, cada um dos dois jogadores recebe metade das 52 cartas do baralho. Cada carta recebida por um jogador é colocada em um monte à sua frente. Cada partida do jogo é composta por 26 rodadas. Em cada rodada, simultaneamente, cada jogador pega a carta que está no topo do seu monte e a mostra ao adversário. O vencedor da rodada é o jogador que tiver a carta de maior valor. Em uma rodada pode haver empate. O vencedor da partida é o jogador que vencer mais rodadas. Em uma partida também pode haver empate. Nesta questão, os jogadores da partida de War simulada pelo seu programa serão dois físicos ilustres do Instituto de Tecnologia da Califórnia (Caltech): Sheldon Cooper (Sheldon) e Leonard Hofstadter (Leonard). A seguir é exibido o resultado de uma partida de War jogada entre Sheldon e Leonard. Sheldon: K Q J 5 3 8 2 D A A Q 7 K 6 9 Q 6 2 7 D 6 9 J 8 D J Leonard: 4 9 D 2 3 4 4 3 7 K 5 A 4 5 K A 2 9 5 J 3 7 8 Q 6 8 Venceu : S S S S E S L S S S S L S S L L S L S L S S S L S S Na partida exemplificada acima, cada coluna corresponde a uma rodada. Na linha com o rótulo Venceu, um caractere 'S' indica que Sheldon venceu a rodada correspondente à coluna, um caractere 'L' indica que Leonard venceu a rodada correspondente a coluna, e um caractere 'E' indica que houve empate. Como pode ser verificado, a primeira rodada foi vencida por Sheldon pois pegou o K enquanto a carta que Leonard pegou foi o 4. Na quinta rodada, tivemos um empate, Sheldon e Leonard pegaram cartas de mesmo valor, o 3 e o 3. A primeira rodada vencida por Leonard foi a sétima quando pegou o 4 enquanto que Sheldon pegou o 2. O vencedor da partida foi Sheldon pois ele venceu 18 das 26 rodadas. As constantes definidas abaixo devem ser obrigatoriamente utilizadas nessa questão, sem precisar redefini las. O valor de cada carta depende apenas de seu posto: 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'D', 'J', 'Q', e 'K'. O dicionário VALOR tem como chave o posto de cada carta e apresenta o seu valor. # naipes, postos e valores de cada carta de acordo com o posto # NAIPES = ['u2661', 'u2665', 'u2662', 'u2663'] NAIPES = [' ', ' ', ' ', ' '] POSTOS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'D', 'J', 'Q', 'K'] VALOR = {'A':14, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'D':10, 'J':11, 'Q':12, 'K':13} Item (a) Escreva uma classe Carta que será usada para criar um objeto que representa uma carta de um baralho. Essa classe deve obedecer as especificações listadas a seguir. Construtor da classe: deve receber como parâmetros um string naipe (da lista NAIPES) e um string posto (da lista POSTOS) que serão usados para criar a representação de uma carta. pegue_naipe(): a classe deve possuir um método pegue_naipe() que retorna o naipe de um objeto da classe. pegue_posto(): a classe deve possuir um método pegue_posto() que retorna o posto de um objeto da classe. pegue_valor(): a classe deve possuir um método pegue_valor() que retorna o valor de um objeto da classe. Esse método deve utilizar o dicionários VALOR. class Carta: def init (self,naipe,posto): self.naipe = naipe self.posto = posto https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 3/6

def pegue_naipe(self): return self.naipe def pegue_posto(self): return self.posto def pegue_valor(self): return VALOR[self.posto] Item (b) Escreva uma classe Baralho que será usada para criar um objeto que representa um baralho. Essa classe deve obedecer as especificações listadas a seguir. Construtor da classe: para criar a representação de um baralho, o construtor da classe deve utilizar uma lista (= list) de objetos da classe Carta (item (a)). A representação de cada uma das 52 cartas de um baralho deve estar presente na lista. embaralhe(): a classe deve possuir um método embaralhe() que embaralha a lista de cartas de um dado objeto da classe. Para isso utilize a função random.shuffle() que recebe uma lista e embaralha os seu elementos. Não escreva a função random.shuffle(), apenas use a. pegue_carta(): a classe deve possuir um método pegue_carta() que remove e retorna a carta no final da lista de cartas de um dado objeto da classe. class Baralho(): # def init (self): self.baralho = [] for naipe in NAIPES: for posto in POSTOS: carta = Carta(naipe,posto) self.baralho.append(carta) # def embaralhe(self): random.shuffle(self.baralho) # def pegue_carta(self): carta = self.baralho.pop() return carta Item (c) Escreva uma classe Jogador que será usada para criar um objeto que representa um jogador de War. Essa classe deve obedecer as especificações listadas a seguir. Construtor da classe: recebe como parâmetro um string nome com o nome do jogador. Um jogador deve ser representado através de um string com o seu nome e uma lista contendo a representação das cartas no seu monte. No momento da criação, o monte de cartas do jogador está vazio. Cada uma das cartas no monte do jogador deve ser representada através de objetos da classe Carta (item (a)). A classe deve possuir um método que permita que ao utilizarmos a função print() com um objeto da classe Jogador, o nome do jogador e as todas as cartas no seu monte sejam mostrados como nos exemplos abaixo: Sheldon: 8 7 7 J 5 J 3 Q Q K Leonard: A 4 2 2 2 D 9 A 6 9 7 4 4 5 K 3 D 6 recebe_carta(): a classe deve possuir um método recebe_carta() que recebe como parâmetro um objeto carta da classe Carta (item (a)) e põe a carta no topo do monte de cartas de um dado objeto da classe. pegue_carta(): a classe deve possuir um método pegue_carta() que remove e retorna a carta no topo do monte de cartas de um dado objeto da classe. class Jogador: def init (self, nome): self.nome = nome https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 4/6

self.monte = [] def str (self): no_cartas = len(self.monte_jogador) s = "%s: " %(self.nome) for i in range(no_cartas 1, 1, 1): carta = self.monte[i] s += carta.pegue_naipe() + carta.pegue_posto() + ' ' return s def recebe_carta(self,carta): self.monte.append(carta) def pegue_carta(self): carta = self.monte.pop() return carta Item (d) Neste item você deverá escrever uma função main() que simula uma partida de War entre os jogadores Sheldon e Leonard. A sua função deverá utilizar objetos das classes Carta (item (a)), Baralho (item (b)) e Jogador (item (c)). A seguir estão três exemplos de execução do programa. War entre Sheldon e Leonard Sheldon: 9 9 4 5 6 Q K 4 6 6 2 D J K Q A 8 7 A D 3 5 7 6 7 J Leonard: 4 D 3 K 3 2 8 7 D 2 8 9 2 5 J Q A 8 J Q 3 9 A 4 5 K Venceu : S L S L S S S L L S L S S S S S L L S L E L L S S L Sheldon venceu a partida. War entre Sheldon e Leonard Sheldon: 7 3 9 2 J 8 4 J 4 7 8 A A A 5 K Q 2 Q 9 D 4 3 5 K Q Leonard: 7 Q 9 7 K 8 6 9 J 6 2 4 2 A D 8 6 3 K J 6 D 5 3 5 D Venceu : E L E L L E L S L S S S S E L S S L L L S L L S S S Sheldon e Leonard empataram a partida. War entre Sheldon e Leonard Sheldon: 3 2 K Q 9 3 2 7 A 3 5 D 7 9 8 D J 6 2 7 A D K 2 8 6 Leonard: 8 7 4 3 J Q 9 J Q K 4 5 9 J 4 6 K 4 Q 6 5 A 8 D 5 A Venceu : L L S S L L L L S L S S L L S S L S L S S L S L S L Leonard venceu a partida. As mensagens emitidas pelo seu programa devem ser idênticas às mensagens mostradas no exemplo. Na simulação de uma partida um baralho deve ser criado e embaralhado. Cada um dos jogadores deve receber metade das 52 cartas do baralho. Cada carta recebida por um jogador é colocada no seu monte. Linhas com os nomes dos jogadores seguidos pelas cartas nos seus montes devem ser impressas, como mostra o exemplo. Em cada uma das rodadas, as cartas no topo dos montes dos jogadores são comparadas. No final da partida devem impressas duas linhas: uma linha contendo o rótulo Venceu: seguido das marcas correspondentes aos vencedor de cada rodada (= SHELDON ou LEONARD) ou ainda a marca representando empate (= EMPATE) e uma linha indicando o jogador que venceu a partida ou se houve empate (veja os exemplos de execução). A seguir estão alguma constantes que podem ser usadas pela sua função main(). # resultados de uma rodada SHELDON = 'S' LEONARD = 'L' EMPATE = 'E' # número de cartas e rodadas N_CARTAS = 52 N_RODADAS = 26 def main(): print("war entre Sheldon e Leonard") # 1 crie os jogadores sheldon = Jogador("Sheldon") leonard = Jogador("Leonard") # 2 crie baralho baralho = Baralho() # 3 embaralhe as cartas https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 5/6

baralho.embaralhe() # 4 distribua cartas for rodadas in range(n_rodadas): carta = baralho.pegue_carta() sheldon.recebe_carta(carta) carta = baralho.pegue_carta() leonard.recebe_carta(carta) # 5 mostre cartas dos jogadores print(sheldon) print(leonard) # 6 rodadas cont_sheldon = 0 # contador de rodadas vencidas por sheldon cont_leonard = 0 # contador de rodadas vencidas por leonard vencedores = 'Venceu :' for rodada in range(n_rodadas): # pegue cartas dos montes e seu valores carta_sheldon = sheldon.pegue_carta() valor_sheldon = carta_sheldon.pegue_valor() carta_leonard = leonard.pegue_carta() valor_leonard = carta_leonard.pegue_valor() # verifique quem ganhou a rodada if valor_sheldon == valor_leonard: vencedores += ' ' + EMPATE elif valor_sheldon > valor_leonard: vencedores += ' ' + SHELDON cont_sheldon += 1 else: # valor_sheldon < valor_leonard vencedores += ' ' + LEONARD cont_leonard += 1 # 7 mostre lista de vencedores print(vencedores) # 8 mostre vencedor if cont_sheldon == cont_leonard: print("sheldon e Leonard empataram a partida.") if cont_sheldon > cont_leonard: print("sheldon venceu a partida.") else: # cont_sheldon < cont_leonard: print("leonard venceu a partida.") Last modified: Tue Jun 30 20:30:25 BRT 2015 https://www.ime.usp.br/~mac2166/provas/psub 2015Py.html 6/6