MAC2166 - Introdução à Computação

04/05/2017 - Aula 12

Problema 12.1

Escreva um programa que lê n e uma matriz An x n, e verifica se A é simétrica.

In [8]:
#-----------------------------------------------------
def main():
    '''
    Programa que lê n e uma matriz de inteiros n x n
    e verifica se a matriz é simétrica.
    '''
    # leia a matriz
    a_mat = leia_matriz()

    # imprima a matriz
    imprima_matriz(a_mat)

    if simetrica(a_mat):
        print("Matriz simétrica.")
    else:
        print("Matriz não simétrica.")

#-------------------------------------------------------
def leia_matriz():
    '''(None) -> matriz (lista da lista)

    Função que lê do teclado o número n_linhas de linhas
    e o numero n_colunas de colunas e os elementos de
    uma matriz de dimensão n_linha x n_colunas.

    A função cria e retorna a matriz lida.
    '''
    # leia as dimensoes da matriz
    n_linhas  = int(input("Digite o número de linhas: "))
    n_colunas = int(input("Digite o número de colunas: "))

    # leitura da matriz de uma matriz m x n
    matriz = []
    for i in range(n_linhas):
        # leia elementos da linha i
        linha = [] # nova linha
        for j in range(n_colunas):
            print("Digite o elemento (%d,%d): " %(i,j), end="")
            num = int(input())
            linha.append(num)

        # coloque a linha na matriz
        matriz.append(linha)

    return matriz

#-------------------------------------------------------
def imprima_matriz(matriz):
    '''(matriz) -> None

    Recebe e imprime uma matriz de inteiros.
    '''
    n_linhas  = len(matriz)
    n_colunas = len(matriz[0])

    print("Matriz: %d x %d" %(n_linhas, n_colunas))
    for i in range(n_linhas):
        # imprima a linha i
        for j in range(n_colunas):
            print("%6d" %(matriz[i][j]), end="")
        # pule uma linha
        print()

#----------------------------------------------------------
def simetrica(matriz):
    '''(matriz) -> bool

    Recebe uma matriz e returna True se a matriz for simétrica,
    em caso contrário retorna False.

    Pre-condição: a funcao supõe que a matriz é quadrada

    >>> a = [[1,2,3],[2,1,4],[3,4,1]]
    >>> a
    [[1, 2, 3], [2, 1, 4], [3, 4, 1]]
    >>> imprima_matriz(a)
    Matriz: 3 x 3
         1     2     3
         2     1     4
         3     4     1
    >>> simetrica(a)
    True
    '''
    n = len(matriz)
    é_simétrica = True

    i = 0
    while i < n and é_simétrica:
        j = 0
        while j < i and é_simétrica:
            if matriz[i][j] != matriz[j][i]:
                é_simétrica = False
                print("Posição [%d][%d]: %d dif %d"
                      %(i, j, matriz[i][j], matriz[j][i]))
            j = j + 1
        i = i + 1

    return é_simétrica


#------------------------------------------------------
# inicio da execucao do programa
main()
Digite o numero de linhas: 3
Digite o numero de colunas: 3
Digite o elemento (0,0): 1
Digite o elemento (0,1): 2
Digite o elemento (0,2): 3
Digite o elemento (1,0): 2
Digite o elemento (1,1): 1
Digite o elemento (1,2): 4
Digite o elemento (2,0): 3
Digite o elemento (2,1): 4
Digite o elemento (2,2): 1
Matriz: 3 x 3
     1     2     3
     2     1     4
     3     4     1
Matriz simetrica.

Problema 12.2

Escreva um programa que leia inteiros positivos m e n e os elementos de uma matriz A de números inteiros de dimensão m x n e conta o número de linhas e colunas que têm apenas zeros.

In [10]:
def main():
    '''
    Programa que lê n e m e uma matriz de inteiros n x m
    e conta quantas linhas e quantas colunas da matriz têm apenas zeros.
    '''
 
    A = leia_matriz()
    
    # obtém as dimensões m e n da matriz m x n lida 
    m = len(A)
    if m > 0:
        n = len(A[0])
    else:
        n = 0
    
        
    cont_linha_zeros = 0
    i = 0
    while i < m:
        linha_somente_zeros = True
        j = 0
        while j < n:
            if A[i][j] != 0.0:
                linha_somente_zeros = False

            j += 1
        i += 1

        if linha_somente_zeros:
            cont_linha_zeros += 1
            
            
    cont_coluna_zeros = 0
    j = 0
    while j < n:
        coluna_somente_zeros = True
        i = 0
        while i < m:
            if A[i][j] != 0.0:
                coluna_somente_zeros = False

            i += 1
        j += 1
            
        if coluna_somente_zeros:
            cont_coluna_zeros += 1

    print("A matriz tem", cont_linha_zeros, "linhas compostas por zeros.")
    print("A matriz tem", cont_coluna_zeros, "colunas compostas por zeros.")
    
    
#-------------------------------------------------------
def leia_matriz():
    '''(None) -> matriz (lista da lista)

    Função que lê do teclado o número n_linhas de linhas
    e o numero n_colunas de colunas e os elementos de
    uma matriz de dimensão n_linha x n_colunas.

    A função cria e retorna a matriz lida.
    '''
    # leia as dimensoes da matriz
    n_linhas  = int(input("Digite o número de linhas: "))
    n_colunas = int(input("Digite o número de colunas: "))

    # leitura da matriz de uma matriz m x n
    matriz = []
    for i in range(n_linhas):
        # leia elementos da linha i
        linha = [] # nova linha
        for j in range(n_colunas):
            print("Digite o elemento (%d,%d): " %(i,j), end="")
            num = int(input())
            linha.append(num)

        # coloque a linha na matriz
        matriz.append(linha)

    return matriz

#-------------------------------------------------------
main()
Digite o número de linhas: 3
Digite o número de colunas: 4
Digite o elemento (0,0): 0
Digite o elemento (0,1): 0
Digite o elemento (0,2): 0
Digite o elemento (0,3): 0
Digite o elemento (1,0): 0
Digite o elemento (1,1): 1
Digite o elemento (1,2): 0
Digite o elemento (1,3): 1
Digite o elemento (2,0): 0
Digite o elemento (2,1): 0
Digite o elemento (2,2): 0
Digite o elemento (2,3): 0
A matriz tem 2 linhas compostas por zeros.
A matriz tem 2 colunas compostas por zeros.

Problema 12.3

Escreva um programa que recebe duas matrizes Am x n e Bn x p e imprime a matriz Cm x p que é o produto de A por B.

In [ ]:
def main():
    '''
    Programa que lê duas matrizes de inteiros e imprime a matriz produto delas.
    e imprime a m.
    '''
    m = int(input("Digite o numero de linhas da matriz A: "))
    n = int(input("Digite o numero de colunas da matriz A: "))
    A = le_matriz(m,n)

    p = int(input("Digite o numero de colunas da matriz B: "))
    B = le_matriz(n,p)

    C = []
    for i in range(m):
        C.append([])
        for j in range(p):
            soma = 0
            for k in range(n):
                soma += A[i][k] * B[k][j]
            
            C[i].append(soma)
            
    print("O resultado da multiplicaçao de A por B e: ")
    imprime_matriz(C)        

        
def le_matriz(m, n):
    """
    (int, int) --> list
    
    Funçao que recebe como entrada um numero de linhas m
    e um numero de colunas n e entao le uma matriz de inteiros
    tamanho m x n, ou seja, uma lista contendo m listas
    com n elementos cada. A matriz lida eh devolvida como
    valor de retorno da funçao. 
    """

    print("Digite os elementos da matriz de tamanho %dx%d:" %(m,n))
    matriz = []
    for i in range(m):
        matriz.append([])
        for j in range(n):
            elemento = int(input("Elemento da %da. linha, %da. coluna: " %(i+1,j+1)))
            matriz[i].append(elemento)
            
    return matriz

def imprime_matriz(matriz):
    """
    (list) --> None

    Funçao que recebe uma matriz como entrada, ou seja uma
    lista de listas, e entao a imprime.
    A funçao nao tem nenhum valor de retorno.
    """
    
    for linha in matriz:
        for elemento in linha:
            print(elemento, end = " ")
        print()

#########################
main()

Problema 12.4

Compute a matriz de campo minado (minesweeper)

a) Escreva uma função que recebe como parâmetros uma matriz inteira Anxm, e uma posição (i,j) da matriz, e conta quantas posições ao redor da posição (i,j) contém o valor -1.

b) Escreva um programa que lê uma matriz Anxm de 0's (posições livres) e -1's (minas). Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade de minas ao redor de cada posição livre da matriz.

Exemplo

Para a matriz

00000
0-1-1-10
00000
00-100

a saída deve ser:

12321
1-1-1-11
13431
01-110
In [1]:
def main():
    m = int(input("Digite o número de linhas da matriz A: "))
    n = int(input("Digite o número de colunas da matriz A: "))
    A = le_matriz(m,n)

    print("Matriz lida:")
    imprime_matriz(A)

    for i in range(m):
        for j in range(n):
            if A[i][j] == 0:
                A[i][j] = conta_minas(A,i,j)
                
    print("Matriz de resultado:")
    imprime_matriz(A)   

def conta_minas(matriz, i, j):
    """
    (list, int, int) --> int
    Função que recebe como parâmetro uma matriz e uma posição (i,j)
    dessa matriz e devolve a quantidade de posições ao redor da posição
    (i,j) que contêm o valor -1 nessa matriz.

    """
    cont = 0
    
    # Verifica a posição à esquerda
    if j-1 >= 0 and matriz[i][j-1] == -1:
        cont +=1

    # Verifica a posição à direita
    if j+1 < len(matriz[i]) and matriz[i][j+1] == -1:
        cont +=1

    # Verifica as posições acima
    if i-1 >= 0:
        if matriz[i-1][j] == -1:
            cont +=1
        if j-1 >= 0 and matriz[i-1][j-1] == -1:
            cont +=1
        if j+1 < len(matriz[i]) and matriz[i-1][j+1] == -1:
            cont +=1

    # Verifica as posições abaixo
    if i+1 < len(matriz):
        if matriz[i+1][j] == -1:
            cont +=1
        if j-1 >= 0 and matriz[i+1][j-1] == -1:
            cont +=1
        if j+1 < len(matriz[i]) and matriz[i+1][j+1] == -1:
            cont +=1
    
    return cont

def le_matriz(m, n):
    """
    (int, int) --> list
    
    Função que recebe como entrada um número de linhas m
    e um número de colunas n e então lê uma matriz de inteiros
    tamanho m x n, ou seja, uma lista contendo m listas
    com n elementos cada. A matriz lida é devolvida como
    valor de retorno da função. 
    """

    print("Digite os elementos da matriz de tamanho %dx%d:" %(m,n))
    matriz = []
    for i in range(m):
        matriz.append([])
        for j in range(n):
            elemento = int(input("Elemento da %da. linha, %da. coluna: " %(i+1,j+1)))
            matriz[i].append(elemento)
            
    return matriz

def imprime_matriz(matriz):
    """
    (list) --> None

    Função que recebe uma matriz como entrada, ou seja uma
    lista de listas, e então a imprime.
    A função não tem nenhum valor de retorno.
    """
    
    for linha in matriz:
        for elemento in linha:
            print("%2d" %elemento, end = " ")
        print()

 
################
main()
Digite o número de linhas da matriz A: 4
Digite o número de colunas da matriz A: 5
Digite os elementos da matriz de tamanho 4x5:
Elemento da 1a. linha, 1a. coluna: 0
Elemento da 1a. linha, 2a. coluna: 0
Elemento da 1a. linha, 3a. coluna: 0
Elemento da 1a. linha, 4a. coluna: 0
Elemento da 1a. linha, 5a. coluna: 0
Elemento da 2a. linha, 1a. coluna: 0
Elemento da 2a. linha, 2a. coluna: -1
Elemento da 2a. linha, 3a. coluna: -1
Elemento da 2a. linha, 4a. coluna: -1
Elemento da 2a. linha, 5a. coluna: 0
Elemento da 3a. linha, 1a. coluna: 0
Elemento da 3a. linha, 2a. coluna: 0
Elemento da 3a. linha, 3a. coluna: 0
Elemento da 3a. linha, 4a. coluna: 0
Elemento da 3a. linha, 5a. coluna: 0
Elemento da 4a. linha, 1a. coluna: 0
Elemento da 4a. linha, 2a. coluna: 0
Elemento da 4a. linha, 3a. coluna: -1
Elemento da 4a. linha, 4a. coluna: 0
Elemento da 4a. linha, 5a. coluna: 0
Matriz lida:
 0  0  0  0  0 
 0 -1 -1 -1  0 
 0  0  0  0  0 
 0  0 -1  0  0 
Matriz de resultado:
 1  2  3  2  1 
 1 -1 -1 -1  1 
 1  3  4  3  1 
 0  1 -1  1  0 

Tópicos vistos na Aula 12

  • Exercícios envolvendo a criação e manipulação de matrizes