Resolução do exame de Computadores e Programação
da licenciatura em Engenharia Biomédica
Solução da questão 1
# Importa modulos necessarios import sys
import string import copy #
# Funcao para ler uma imagem #
def le_imagem():
# Primeiro pede nome
n_fich=raw_input("Ficheiro com imagem ? ") # Inicializa lista imagem=[] # Abre imagem f_imagem=open(n_fich,'r') # Le linhas imagem_ascii=f_imagem.readlines() # Fecha ficheiro f_imagem.close
# Converte dados para numeros imagem_int=[] for l in range(len(imagem_ascii)): linha = string.split(imagem_ascii[l]) linha_int=map(string.atoi,linha) imagem_int.append(linha_int) # Obtem dimensoes linhas=len(imagem_int) colunas=len(imagem_int[0])
# Verifica se todas as linhas tem o mesmo numero de elementos for l in range(linhas):
if len(imagem_int[l]) != colunas:
print "Existem linhas com numero de elementos diferentes." sys.exit
# Testa paridade de linhas e colunas if(linhas%2!=0 or colunas%2!=0):
print "Numero de linhas ou colunas nao e multiplo de 2." sys.exit
# Devolve imagem return imagem_int #
# Funcao para testar dimensoes # def testa_dim(i1,i2,i3,i4): l1=len(i1) l2=len(i2) l3=len(i3) l4=len(i4) c1=len(i1[0]) c2=len(i2[0]) c3=len(i3[0]) c4=len(i4[0])
return(l1==l2 and l2==l3 and l3==l4 and c1==c2 and c2==c3 and c3==c4) #
# Funcao para criar imagem mosaico #
def cria_mosaico(i1,i2,i3,i4): # Determina dimensoes linhas=len(i1)
colunas=len(i1[0])
# Cria mosaico por copia de i1 mosaico=copy.deepcopy(i1)
for l in range(linhas/2): for c in range(colunas/2): # Canto esquerdo superior
mosaico[l][c]=(i1[l*2][c*2]+i1[l*2][c*2+1]+i1[l*2+1][c*2]+i1[l*2+1][c*2+1])/4 # Canto direito superior
mosaico[l][c+colunas/2]=(i2[l*2][c*2]+i2[l*2][c*2+1]+i2[l*2+1][c*2]+i2[l*2+1][c*2+1])/4 # Canto esquerdo inferior
mosaico[l+linhas/2][c]=(i3[l*2][c*2]+i3[l*2][c*2+1]+i3[l*2+1][c*2]+i3[l*2+1][c*2+1])/4 # Canto direito inferior
# Devolve nova imagem return mosaico
#
# Funcao para gravar imagem # def grava_imagem(nome_fich,imag): # Abre ficheiro fich=open(nome_fich,'w') # Grava informacao for l in range(len(imag)): for c in range(len(imag[0]): fich.write(str(imag[l][c])) fich.write(' ') fich.write('\n') # Fecha ficheiro fich.close # # Programa principal #
# Le quatro imagens originais imagem1=le_imagem()
imagem2=le_imagem() imagem3=le_imagem() imagem4=le_imagem()
# Testa coerencia de dimensoes
if(testa_dim(imagem1,imagem2,imagem3,imagem4)==False):
print "Erro : imagens fonte nao tem as mesmas dimensoes." sys.exit
# Cria mosaico
mosaico=cria_mosaico(imagem1,imagem2,imagem3,imagem4) # Guarda mosaico
saida=raw_input("Nome do ficheiro mosaico ? ") grava_imagem(saida,mosaico)
Conteúdo de ficheiros com imagens de teste e resultado
Imagem 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2Imagem 3
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6Mosaico Resultante
1 1 1 1 3 3 3 3 1 1 1 1 3 3 3 3 2 2 2 2 4 4 4 4 2 2 2 2 4 4 4 4 5 5 5 5 7 7 7 7 5 5 5 5 7 7 7 7 6 6 6 6 8 8 8 8 6 6 6 6 8 8 8 8Imagem 2
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4Imagem 4
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8Solução da questão 2
# alinea a) def LeBases(nomeFich): lis = [] f = open(nomeFich, 'r') linha = f.readline() while linha != '':if (linha[0] !='A' and linha[0] !='C' and linha[0] !='G' and linha[0] !='T'): f.close()
return -1
lis += [linha[0]] # De cada linha lida do ficheiro so guarda o primeiro caracter (o seguinte e o '\n') linha = f.readline()
f.close() return lis
# alinea b)
fich = raw_input('Por favor introduza o nome do ficheiro a abrir:\n') listaBases = LeBases(fich) ATT = 0 TAT = 0 GCAA = 0 encontrouSeq = 0 anteriorBase3='' anteriorBase2='' anteriorBase1='' actualBase=''
for base in listaBases:
anteriorBase3 = anteriorBase2 #desliza uma base para a direita na sequencia anteriorBase2 = anteriorBase1 #desliza uma base para a direita na sequencia anteriorBase1 = actualBase #desliza uma base para a direita na sequencia actualBase = base
if (encontrouSeq > 0):
encontrouSeq -= 1 #salta 3 ou 2 bases para a direita ate que encontrouSeq seja de novo zero continue
if (anteriorBase2 == 'A' and anteriorBase1 == 'T' and actualBase == 'T'): ATT += 1 #encontrou uma sequencia ATT
encontrouSeq = 2 #esta variavel e' usada para saltar as 2 proximas bases (que ainda fazem parte da sequencia ATT actual)
continue
if (anteriorBase2 == 'T' and anteriorBase1 == 'A' and actualBase == 'T'): TAT += 1 #encontrou uma sequencia TAT
encontrouSeq = 2 #esta variavel e' usada para saltar as 2 proximas bases (que ainda fazem parte da sequencia TAT actual)
continue
if (anteriorBase3 == 'G' and anteriorBase2 == 'C' and anteriorBase1 == 'A' and actualBase == 'A'): GCAA += 1 #encontrou uma sequencia GCAA
encontrouSeq = 3 #esta variavel e' usada para saltar as 3 proximas bases (que ainda fazem parte da sequencia GCAA actual)
continue print "ATT: " + ATT * '*' print "TAT: " + TAT * '*' print "GCAA: " + GCAA * '*' #alinea c)
f = open('Sequencias.txt', 'a')
f.write('Quantidade de sequencias detectadas:\n\n') f.write(str(ATT) + ' ATT\n')
f.write(str(TAT) + ' TAT\n') f.write(str(GCAA) + ' GCAA\n\n')
f.write('Nao foram detectadas mais sequencias.') f.close()