MAC2166 Introdução à Computação

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

Python. Resumo e Exercícios P2 Parte 1

MAC2166 Introdução à Computação

MAC2166 Introdução à Computação

MAC2166 Introdução à Computação

DURAÇÃO DA PROVA: 2 horas

Algoritmos e Estrutura de Dados Aula 02 Listas em Python

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

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

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO - CAMPUS CAXIAS. Aluno (s): 01 ATIVIDADE. Revisão de Conteúdo

1 O filtro da mediana

Fundamentos da Programação

Matrizes. Vanessa Braganholo

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

1 O filtro da mediana

Métodos Computacionais em Física

Introdução à Computação - aulas 13 e 14-

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

LISTA DE EXERCÍCIOS 2

Python 3.x Estrutura de Repetição while

imprimir seus quadrados.

Departamento de Informática PUC-Rio INF Estruturas de Dados Lista 2 Completa (Gerada em 8 de maio de 2006)

TCC 00308: Programação de Computadores I Matrizes

1ª Lista de Exercícios

Estruturas de Repetição WHILE e DO- WHILE

Lista de Exercícios de Algoritmos - 04 Para cada um dos exercícios abaixo, faça um programa (em laboratório) que teste a função.

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

char* prefixo (char* str, int n);

DURAÇÃO DA PROVA: 2 horas

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

Lista 2 TP060. Exercícios Vetores

Programação das Aulas

1 Resumo: Matrizes. 2.1 Como declarar uma matriz IME/USP. Departamento de Ciência da Computação

UNIVERSIDADE FEDERAL DE ITAJUBÁ CANDIDATO: CURSO PRETENDIDO: SOLUÇÃO

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

MCG126 Programação de Computadores II

Algoritmos e Programação

Aula de hoje. Comandos. Comandos simples. Comandos. Comandos de controle. Bloco de comandos. SCC Introdução à Programação para Engenharias

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

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

Laços de repetição for, while, do-while

GEQ Prof. Paulo R. Coelho. Lista para prova

INSTRUÇÕES DE REPETIÇÃO

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

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

PRIMEIROS PASSOS COM PYTHON. Prof. Msc. Luis Filipe Alves Pereira 2015

Vetores. Introdução à Programação para Biologia Molecular

Universidade Federal de Uberlândia Faculdade de Computação. Estruturas de repetição

Aula 06 Introdução à Programação Matrizes

Exercícios sobre repetição. 1. Escreva um método que lê via teclado 8 números e retorna a quantidade de negativos.

Laboratório 3 Comandos de repetição while, do-while e for

Introdução à Computação

EP 2 - MAC 2166 Uma solução comentada

UNIVERSIDADE LUSÓFONA DE HUMANIDADES E TECNOLOGIAS 1º Semestre 2007/2008

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Processamento da Informação Teoria. Strings

LISTA DE EXERCÍCIOS - ro. 04

RESOLUÇÃO. Computação e Programação (2009/2010-1º Semestre) 1º Teste (11/11/2009) Nome. Número. Leia com atenção os pontos que se seguem:

DCC001 - Programação de Computadores. Lista de Exercícios 02 - Estruturas de Dados Homogêneas (Vetores).

CURSO BÁSICO DE PROGRAMAÇÃO AULA 15. Revisão Vetores e Matrizes Trabalho

Fundamentos da Programação

Funções. Capítulo (2) Considere a seguinte interacção em Python: >>> def f1(x):... return x * x... >>> f1(5) 25 >>> f2 = f1 >>>

1. Para cada pergunta selecione uma opção. Resposta correta +2, incorreta -1. [12 pontos]

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

Lista 02: Pilhas & Filas

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

Transcrição:

Departamento de Ciência da Computação - IME - USP MAC2166 Introdução à Computação Escola Politécnica - Primeiro Semestre de 2014 Prova 2 QUESTÃO 1 (str,str,str) -> str que recebe três sequências de caracteres (strings) não vazias, sendo que a terceira é um caractere coringa. A função deve devolver uma sequência que é uma cópia da primeira sequência, porém substituindo-se as ocorrências dos caracteres da segunda sequência pelo caractere coringa, obedecendo a ordem de ocorrência em ambas as sequências. Exemplos: str1: "Lá vem o pato pato aqui pato acolá" str2: "papa" coringa: "X" Saída: "Lá vem o XXto XXto aqui pato acolá" str1: "Era uma casa muito engraçada não tinha teto, não tinha nada" str2: "cratera" coringa: "*" Saída: "Era uma *asa muito eng**çada não *inha t*to, não tinha nada" str1: "5248942" str2: "130" coringa: "X" Saída: "5248942" str1: "ABCEFG" str2: "ABCDEFGHIJK" coringa: "?" Saída: "???EFG" 1: (str, str, str) -> str novo_str = '' string vazio i = 0 while i < len(str1) and j < len(str2): if str1[i] == str2[j]: novo_str += coringa copia o resto do string str1 while i < len(str1): 2: usa fatiamento para copiar o final do novo string (str, str, str) -> str novo_str = "" string vazio i = 0 while i < len(str1) and j < len(str2): if str1[i] == str2[j]: novo_str += coringa copia o resto do string str1 através de fatiamento novo_str += str1[i:] 3. (str, str, str) -> str novo_str = "" string vazio len1 = len(str1) len2 = len(str2) for i in range(len1): determine próximo caractere de novo_str

if j < len2 and str1[i] == str2[j]: caractere = coringa caractere = str1[i] concatena com novo_str novo_str += caractere 4: (str, str, str) -> str novo_str = "" string vazio for i in range(len(str1)): determine próximo caractere de novo_str if j < len(str2) and str1[i] == str2[j]: novo_str += coringa QUESTÃO 2 Dadas duas sequências x 1, x 2,...,x n e y 1, y 2,..., y n, n > 0, de números reais, os respectivos valores médios são dados por x = (x 1 + x 2 +... + x n )/n e y = (y 1 + y 2 +... + y n )/n A diferença x i x (e, similarmente, y i y), i= 1, 2,...,n, é denominada variação. O coeficiente de correlação entre os valores das sequências x 1, x 2,...,x n e y 1, y 2,..., y n é definido por: r = [ i=1,2,...n (x i x) (y i y)] / [( i=1,2,...n (x i x) 2 ) 0.5 ( i=1,2,...n (y i y) 2 ) 0.5 ] Dada uma tabela com as notas de um turma, gostaríamos de verificar se há alguma correlação entre as notas de EP e notas de prova. Em estatística, o coeficiente de correlação pode ser utilizado para tal fim. Suponha que a primeira coluna da tabela contém o nome dos alunos e as demais colunas contêm as notas de EPs e Provas. Por exemplo, a tabela abaixo é de uma turma com 5 alunos e contém as notas do EP1, P1, EP2 e P2. O traço indica uma nota que não está disponível. NOME EP1 P1 EP2 P2 Fulano 5.0 5.0 3.0 - Beltrano 0.0 10.0 9.0 8.0 Sicrano 10.0 10.0 10.0 10.0 Batman 9.0 9.0-8.0 Pinguin 1.0 2.0 3.0 4.0 Para resolver o problema acima, foi escrito o seguinte programa que lê e imprime uma tabela, lê o índice das colunas que correspondem às sequências para as quais deseja-se calcular o coeficiente de correlação, e então calcula e imprime o coeficiente de correlação. A exemplo do EP3, um valor que não está disponível é representado pelo valor None e deve ser ignorado nos cálculos. import math def main(): tabela = le_tabela() imprime_tabela(tabela) cx = int(input("coluna da primeira seq: ")) cy = int(input("coluna da segunda seq: ")) corr = coeficiente_correlacao(tabela, cx, cy) if corr is None: print("o coeficiente não pode ser calculado") print("a correlação é %f" %corr) Suponha também que as funções abaixo já estão prontas: def le_tabela(): (None) -> tabela Lê, de um arquivo cujo nome é fornecido pelo usuário, uma tabela como a especificada acima. Devolve a tabela em uma lista de listas, correspondendo às linhas da tabela. Um valor não disponível é representado por None. def imprime_tabela(tabela): (tabela) -> None Recebe uma tabela e imprime-a. Você deverá completar o programa escrevendo duas funções especificadas nos itens (a) e (b) a seguir. item (a) def adiciona_coluna_variação(tabela, col): que recebe uma tabela (tabela) como a definida anteriormente e adiciona uma coluna à tabela. A coluna a ser adicionada corresponde à variação de cada valor da coluna de índice col. A variação de um valor None é None. Para o cálculo da média dos valores na coluna de índice col, desconsidere os valores None

1: Versão com "for variavel in range():..." def adiciona_coluna_variação(tabela,col): (tabela) -> tabela Recebe um tabela 'tabela' e o índice 'col' de uma coluna e acrescenta a tabela uma coluna correspondente à variações dos valores na coluna de índice 'col'. Um desvio será None se o valor na coluna for None. calcule a media media = media_coluna(tabela,col) n_lin = len(tabela) número de linhas da tabela calcule variação e adicione an coluna for i in range(n_lin): valor = tabela[i][col] if valor!= None: implica que media!= None tabela[i].append(valor-media) tabela[i].append(none) - def media_coluna(tabela,col): (tabela, int) -> float ou None Recebe uma tabela 'tabela' e calcula a média dos valores na coluna 'col'. Os valores na coluna que são None são desconsiderados. Se a coluna não possui nenhum valor diferente de None a função retorna None calcule a soma e o numero de valores na coluna soma_valores = 0 no_valores = 0 n_lin = len(tabela) número de linhas da tabela for i in range(n_lin): valor = tabela[i][col] if valor!= None: soma_valores += valor no_valores += 1 verifique a a matriz possui algum valor if no_valores > 0: return soma_valores / no_valores se chegou aqui no_valores == 0 2: Versão com "for elemento in lista:..." def adiciona_coluna_variação(tabela,col): (tabela) -> tabela Recebe um tabela 'tabela' e o índice 'col' de uma coluna e acrescenta a tabela uma coluna correspondente à variações dos valores na coluna de índice 'col'. Um desvio será None se o valor na coluna for None. calcule a media media = media_coluna(tabela,col) if linha[col]!= None: implica que media!= None linha.append(linha[col]-media) linha.append(none) - def media_coluna(tabela,col): (tabela, int) -> float ou None Recebe uma tabela 'tabela' e calcula a média dos valores na coluna 'col'. Os valores na coluna que são None são desconsiderados. Se a coluna não possui nenhum valor diferente de None a função retorna None calcule a soma e o numero de valores na coluna soma_valores = 0 no_valores = 0 desconsidere os valores que são None if linha[col]!= None: soma_valores += linha[col] no_valores += 1 verifique se a matriz possui algum valor if no_valores > 0: return soma_valores / no_valores se chegou aqui no_valores == 0 item (b) def coeficiente_correlacao(tabela, col1, col2): que recebe uma tabela (tabela) e os índices col1 e col2 de duas colunas da tabela. A função deve: acrescentar duas colunas à tabela: uma com as variações de cada valor na coluna de índice col1 e outra com as variações de cada valor na coluna de índice col2, imprimir a tabela (usando a função dada), e calcular e devolver o coeficiente de correlação entre as sequências de valores nas colunas de índices col1 e col2. OBS.: No cálculo do coeficiente, os termos que envolvem um valor None não devem ser considerados. Caso não seja possível calcular o coeficiente, deve-se devolver None. Use a função do item anterior, mesmo que você não a tenha feito.

1: Solução ideal. Usa um filtro. import math def adiciona_coluna_variacao(tabela, col): soma = 0 soma += linha[col] if len(tabela) > 0: media = soma / len(tabela) linha.append(linha[col] - media) def filtro(tabela, col): subtab = [] if linha[col] is not None: subtab.append(linha) return subtab def coeficiente_correlacao(tabela, col1, col2): subtab = filtro(filtro(tabela, col1), col2) if len(subtab) == 0: adiciona_coluna_variacao(subtab, col1) adiciona_coluna_variacao(subtab, col2) somaxy = 0 somax2 = 0 somay2 = 0 for linha in subtab: somaxy += linha[-2] * linha[-1] somax2 += linha[-2] * linha[-2] somay2 += linha[-1] * linha[-1] if somax2!= 0 and somay2!= 0: return somaxy/math.sqrt(somax2*somay2) trecho de codigo para testar as funções não faz parte da solução tabela = [['Fulano ', 2, 2, None, 8], ['Beltrano', 1, None, None, 4], ['Sicrano ', None, 2, 3, 4], ['Batman ', 1, 3, 4, 4], ['Pinguin ', None, 2, 3, 4]] print(linha[0], end='') for x in linha[1:]: if x is not None: print('%3d' %x, end=''); print(' -', end='') print() print() print('correlacao 1, 2:', coeficiente_correlacao(tabela, 1, 2)) print('correlacao 1, 3:', coeficiente_correlacao(tabela, 1, 3)) print('correlacao 1, 4:', coeficiente_correlacao(tabela, 1, 4)) print('correlacao 2, 3:', coeficiente_correlacao(tabela, 2, 3)) print('correlacao 2, 4:', coeficiente_correlacao(tabela, 2, 4)) print('correlacao 3, 4:', coeficiente_correlacao(tabela, 3, 4)) 2: Versão com "for variável in range(...):..." def correlacao(tabela,col1,col2): (tabela, int, int) -> float ou None Recebe uma tabela 'tabela' e índices 'col1' e 'col2' de duas colunas da tabela e calcula e retorna o coeficiente de correlação entre as sequências de valores nessas colunas. Retorna None adicione a coluna com as variações dos valores na coluna col1 adiciona_coluna_variação(tabela,col1) adicione a coluna com as variações dos valores na coluna col2 adiciona_coluna_variação(tabela,col2) imprima a nova tabela print_tabela(tabela) soma_numerador = 0 somax2 = 0 somay2 = 0 índices das colunas com as variaçõa... idx_var_col1 = len(tabela[0])-2 índice da coluna com a variação da coluna col1 idx_var_col2 = len(tabela[1])-1 índice da coluna com a variação da coluna col2 no_lin = len(tabela) número de linhas da tabela for i in range(no_lin): valor_col1 = tabela[i][idx_var_col1] valor_col2 = tabela[i][idx_var_col2] if valor_col1!= None and valor_col2!= None: soma_numerador += valor_col1 * valor_col2 if valor_col1!= None: somax2 += valor_col1 * valor_col1 if valor_col2!= None: somay2 += valor_col2 * valor_col2 cuidado para não dividir por zero if somax2 > 0 and somay2 > 0: return soma_numerador / math.sqrt(somax2 * somay2) 3: Versão com "for elemento in lista:..." def correlacao(tabela,col1,col2): (tabela, int, int) -> float ou None Recebe uma tabela 'tabela' e índices 'col1' e 'col2' de duas colunas da tabela e calcula e retorna o coeficiente de correlação entre as sequências de valores nessas colunas. Retorna None

adicione a coluna com as variações dos valores na coluna col1 adiciona_coluna_variação(tabela,col1) adicione a coluna com as variações dos valores na coluna col2 adiciona_coluna_variação(tabela,col2) imprima a nova tabela print_tabela(tabela) no_valores = 0 número de valores soma_numerador = 0 somax2 = 0 somay2 = 0 índices das colunas com as variaçõa... idx_var_col1 = -2 índice da coluna com a variação da coluna col1 idx_var_col2 = -1 índice da coluna com a variação da coluna col2 if linha[-2]!= None and linha[-1]!= None: soma_numerador += linha[-2]*linha[-1] somax2 += linha[-2]*linha[-1] somay2 += linha[-2]*linha[-1] cuidado para não dividir por zero if somax2 > 0 and somay2 > 0: return soma_numerador / math.sqrt(somax2 * somay2) QUESTÃO 3 item (a) que recebe uma matriz 'M e devolve True caso a matriz seja simétrica em relação à sua coluna central, e devolve False em caso contrário. Suponha que a matriz é de inteiros, quadrada e de dimensão ímpar. Exemplo: A matriz abaixo à esquerda é simétrica em relação à sua coluna central. Já a matriz à direita não é. 8 1 0 1 8 2 1 0 1 2 0 2 1 2 0 3 2 0 2 3 0 3 2 3 0 4 3 0 4 3 0 4 3 4 0 5 4 0 4 5 0 5 4 5 0 1 0 0 0 1 item (b) 1: (matriz) -> bool Recebe uma matriz quadrada de ordem ímpar é retorna True se a matriz fo simétrica em relação a coluna central e False em caso contrário. a matriz é simétrica até que se prove o contrário simetrica = True n = len(m) dimensão da matriz i = 0 while i < n and simetrica: while j < n // 2 and simetrica: if M[i][j]!= M[i][n-j-1]: simetrica = False return simetrica 2: (matriz) -> bool Recebe uma matriz quadrada de ordem ímpar é retorna True se a matriz fo simétrica em relação a coluna central e False em caso contrário. n = len(m) dimensão da matriz for i in range(n): for j in range(n//2): if M[i][j]!= M[i][n-j-1]: return False return True 3: Versão "pythoniana" (matriz) -> bool Recebe uma matriz quadrada de ordem ímpar é retorna True se a matriz fo simétrica em relação a coluna central e False em caso contrário. return all( x == list(reversed(x)) for x in M )

que recebe uma matriz M de inteiros, um inteiro positivo ímpar k, os índices i (linha) e j (coluna) de uma posição da matriz, e devolve uma matriz que é uma cópia da submatriz de M, quadrada e de dimensão k, centrada na posição [i][j] da matriz. Você pode supor que a submatriz k k está inteiramente contida em M. Exemplo: Supondo que M é a matriz abaixo à esquerda, k é 3, e i e j são 2 e 1, respectivamente, a submatriz a ser devolvida é a que está abaixo à direita: 2 1 0 1 2 M = 3 2 0 2 3 3 2 0 4 3 0 4 3 4 3 0 5 4 0 4 5 5 4 0 1: (matriz, int, int, int) -> matriz Recebe uma matriz M, um inteiro ímpar k e uma posição e um posição (i,j) da matriz e retorna a submatriz quadrada de dimensão k centrada em (i,j). Pré-condicão: a função supõe que k//2 <= i < len(m) - k//2 k//2 <= j < len(m) - k//2 submatriz que será retornada submatriz = [] a submatriz é centrada em [i][j] tem "raio" é k//2 canto superior direito da submatriz inicio_lin = i - raio inicio_col = j - raio canto inferior esquerdo da submatriz fim_lin = i + raio + 1 fim_col = j + raio + 1 percorra a submatriz a ser clonada for ii in range(inicio_lin,fim_lin): cria a linha ii-raio da submatriz linha = [] lista vazia for jj in range(inicio_col,fim_col): linha.append(m[ii][jj]) submatriz.append(linha) return submatriz 2: (matriz, int, int, int) -> matriz Recebe uma matriz M, um inteiro ímpar k e uma posição e um posição (i,j) da matriz e retorna a submatriz quadrada de dimensão k centrada em (i,j). Pré-condicão: a função supõe que k//2 <= i < len(m) - k//2 k//2 <= j < len(m) - k//2 submatriz que será retornada submatriz = [] a submatriz é centrada em [i][j] e tem "raio" é k//2 percorra a submatriz a ser clonada for ii in range(i-raio, i+raio+1): cria a linha ii-raio da submatriz submatriz.append([]) lista vazia for jj in range(j-raio, j+raio+1): submatriz[ii-raio].append(m[ii][jj]) return submatriz 3: Versão "pythoniana" (matriz, int, int, int) -> matriz Recebe uma matriz M, um inteiro ímpar k e uma posição e um posição (i,j) da matriz e retorna a submatriz quadrada de dimensão k centrada em (i,j). Pré-condicão: a função supõe que k//2 <= i < n - k//2 k//2 <= j < n - k//2 a submatriz é centrada em [i][j] e tem "raio" é k//2 return [ M[x][j-raio:j+raio+1] for x in range(i-raio, i+raio+1) ]

item (c) Escreva um programa que lê uma matriz M de inteiros, um inteiro positivo ímpar k, e imprime o número de submatrizes k k de M que são simétricas em relação à sua coluna central. Para fazer este item, você pode supor que é dada uma função def le_matriz(): que lê e devolve uma matriz, e pode usá-la sem escrevê-la. Além disso, use as funções dos itens anteriores, mesmo que você não as tenha feito. Exemplo: A matriz 5 4 abaixo (à esquerda) contém duas submatrizes 3 3 simétricas em relação a sua coluna central (as duas abaixo à direita). 1 1 1 1 1 1 1..... 1 0 1 1 1 0 1..... M = 0 0 0 0 0 0 0.. 0 0 0 1 0 0 0..... 0 0 0 2 2 2 2..... 2 2 2 1: def main(): '' Programa que lê uma matriz M e um número inteiro ímpar k e imprime o numero de submatrizes k x k de M que são simétricas em relação à coluna central. Pré-condição: o programa supõe que k é menor um igual ao número de linhas e colunas de M, ou seja k <= min(len(m), len(m[0]). leia a matriz e dimensão das submatrizes M = le_matriz() k = int(input("digite um número ímpar: ")) contador de submatrizes simétricas cont = 0 número de linhas e colunas da matriz n_lin = len(m) n_col = len(m[0]) a submatriz é centrada em [i][j] e tem "raio" é k//2 percorra todos os possíveis centros de submatriz de dimensão k for i in range(raio, n_lin - raio): for j in range(raio, n_col - raio): recorta submatriz de dimensao k centrada em [i][j] R = recorte(m,k,i,j) verifique se submatriz é simétrica if simetrica(r): cont = cont + 1 print("há %d submatrizes simétricas de tamanho %d x %d"%(cont,k,k)) 2: Versão "pythoniana". def main(): '' Programa que lê uma matriz M e um número inteiro ímpar k e imprime o numero de submatrizes k x k de M que são simétricas em relação à coluna central. Pré-condição: o programa supõe que k é menor um igual ao número de linhas e colunas de M, ou seja k <= min(len(m), len(m[0]). leia a matriz e dimensão das submatrizes M = le_matriz() k = int(input("digite um número ímpar: ")) print("há %d submatrizes simétricas de tamanho %d x %d" \ %(conta_simetricas(m,k),k,k)) --------------------------------------------------------------- def conta_simetricas(m, k): """ (matriz, int) -> int Recebe uma matriz M e um número inteiro k e retorna o número de submatrizes quadradas de dimensão k da matriz que são simétricas em relação à coluna central. """ submatrizes centradas em [i][j] e com "raio" é k//2 return sum(map( simetrica, \ (recorta(m, k, i, j) for j in range(raio, len(m[0])-raio) \ for i in range(raio, len(m)-raio)) )) Last modified: Wed Jun 18 11:35:44 BRT 2014