quarta-feira, 26 de outubro de 2016

Devagar se vai ao longe

Uma das questões mais frequentes com que um programador novato se depara é o de saber como dominar a complexidade de um problema. Vamos tentar ajudar a ultrapassar essa dificuldade recorrendo a dois princípios simples: aproximar a solução por etapas e esquecer inicialmente alguns aspectos do problema que serão resolvidos posteriormente.

Suponhamos que nos pedem para escrever um programa que nos permita visualizar de modo natural uma matriz, mas não apenas os seus valores mas também a posição de cada elemento na matriz. Um exemplo seria:
Vamos então à solução. Comecemos por tomar uma decisão simples e razoável: mostrar a matriz linha a linha:
def mostra_mat(matriz):
    num_linhas = len(matriz)
    for linha in range(num_linhas):
        # mostra linha
        pass
(a instrução pass… não faz nada, mas permite que o programa esteja sintaticamente correcto!). Parece que não avançamos muito, mas também temos segurança sobre a correcção deste programa. Temos agora que tomar uma segunda decisão: como mostrar uma linha? E decidimos fazê-lo... coluna a coluna!
def mostra_mat(matriz):
    num_linhas = len(matriz)
    num_colunas = len(matriz[0])
    for linha in range(num_linhas):
        # mostra linha
        for coluna in range(num_colunas):
            # mostra coluna
            pass
Está na hora de concretizar. Vamos supor que a matriz está representada por um tuplo de tuplos, ou seja, cada elemento do duplo representa uma linha. Esquecendo o detalhe das posições vamos resolver o problema de mostrar apenas o conteúdo. Por cada linha, vamos imprimir os elementos de todas as colunas. Como queremos que tudo fique na mesma linha, usaremos a palavra chave end da instrução de print com a indicação de que os elementos devem estar separados por uma tabulação.
def mostra_mat(matriz):
    num_linhas = len(matriz)
    num_colunas = len(matriz[0])
    for linha in range(num_linhas):
        # mostra linha
        for coluna in range(num_colunas):
            # mostra coluna
            print(matriz[linha][coluna],end='\t')
        print()
Notar o uso do print() no fim da impressão da linha no final do segundo ciclo for, precisamente para forçar a mudança de linha. Já só falta resolver a questão dos índices da matriz. Mas agora isso é muito fácil, pois em cada momento, os nomes linha e coluna têm os valores de que precisamos:
def mostra_mat(matriz):
    num_linhas = len(matriz)
    num_colunas = len(matriz[0])
    for linha in range(num_linhas):
        # mostra linha
        for coluna in range(num_colunas):
            # mostra coluna
            print('(',linha,',',coluna,'): ',matriz[linha][coluna],end='\t')
        print()
Claro que se não gostarmos muito do aspecto podemos melhorar um pouco a saída, evitando o aparecimento de muitos espaços em branco:
def mostra_mat_2(matriz):
    num_linhas = len(matriz)
    num_colunas = len(matriz[0])
    for linha in range(num_linhas):
        # mostra linha
        for coluna in range(num_colunas):
            # mostra coluna
            print('(%d,%d): %s' % (linha,coluna,matriz[linha][coluna]),end='\t')
        print()
Moral da história: devagar se vai ao longe!

Sem comentários:

Enviar um comentário