MAC2166 - Introdução à Computação

02/05/2017 - Aula 11

Problema 11.1

(a) Escreva uma função que recebe 2 inteiros ini e fim, e uma lista L, tal que 0 <= ini < fim <= len(L) e calcula a soma dos elementos L[i], para ini <= i < fim.

(b) Usando a função anterior, escreva um programa que leia n>0 e uma sequência com n números reais, e determina um segmento de soma máxima. Um segmento é uma subsequência de números consecutivos.

Exemplo: Na sequência

5, 2, -2, -7, 3, 14, 10, -3, 9, -6, 4, 1 ,

a soma do segmento de soma máxima é 33.

In [ ]:
def main():
    '''Programa que lê n > 0 e uma sequência com n
       números reais e calcula a maior soma de
       um de seus segmentos.
    '''
    n = int(input("Digite n:"))

    # leia a sequência
    lista = []
    for i in range(n):
        num = float(input("Digite um número: "))
        lista.append(num)

    soma_max = lista[0] 
    for tam in range(1,n+1):
        # verifique a soma dos segmentos de comprimento tam
        for i in range(n-tam):
            soma_lista = soma(lista,i,i+tam)
            if soma_lista > soma_max:
                soma_max = soma_lista

    # escreva a resposta
    print("Maior soma de um segmento =", soma_max)

#---------------------------------------------
def soma(lista,ini,fim):
    ''' (list,int,int) -> float

    Recebe em `lista` uma lista de números e índices
    `ini` e `fim` da lista e retorna a soma

        lista[ini]+lista[ini+1]+...+lista[fim-1]

    Pré-condicao: a função  supõe que

        0 <= ini < fim <= len(lista)
    '''

    soma_lista = 0
    for i in range(ini,fim):
        soma_lista += lista[i]

    return soma_lista

#---------------------------------------------
# inicio do programa
main()

Matrizes

Matrizes são estruturas bidimensionais (tabelas) com m linhas por n colunas muito importantes na matemática, utilizadas por exemplo para a resolução de sistemas de equações e transformações lineares.

Em Python, uma matriz pode ser representada como uma lista de listas, onde um elemento dessa lista contém uma linha da matriz, que por sua vez corresponde a uma lista com os elementos da coluna da matriz. Veja um exemplo abaixo:

In [1]:
linha0 = [1,10,100,1000]
linha1 = [2,20,200,2000]
linha2 = [3,30,300,3000]
matriz1 = [linha0,linha1,linha2]  # A matriz é uma lista de listas
print(matriz1)
matriz2 = [[1,10,100,1000],[2,20,200,2000],[3,30,300,3000]] # Outra forma de criar a matriz
print(matriz2)
matriz1 == matriz2
[[1, 10, 100, 1000], [2, 20, 200, 2000], [3, 30, 300, 3000]]
[[1, 10, 100, 1000], [2, 20, 200, 2000], [3, 30, 300, 3000]]

Out[1]:
True

Para acessar uma posição específica de uma matriz, usamos uma indexação dupla, ou seja, precisamos indicar o índice da linha onde a posição desejada se encontra e depois o índice da coluna (ou seja, o índice da posição desejada dentro dessa linha). Veja o exemplo a seguir:

In [2]:
matriz3 = [[1,10,100,1000],[2,20,200,2000],[3,30,300,3000]] # Outra forma de criar a matriz
print("O valor da posição na segunda linha da matriz, na quarta coluna, é:", matriz3[1][3])
O valor da posição na segunda linha da matriz, na quarta coluna, é: 2000

Exemplo: criando uma matriz A, de tamanho 5x5, com o valor 2 na posição [1][1] e zero nas demais posições

Considere o código abaixo como uma primeira tentativa de criar a matriz A:

In [3]:
linha_com_zeros = [0]*5
A = [ linha_com_zeros ] * 5
print(A)
A[1][1] = 2
print(A)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]

Essa primeira tentativa de criar a matriz A não foi bem sucedida. Em lugar de criar uma lista contendo 5 listas independentes de tamanho 5, acabamos criando uma lista contendo 5 referências para uma mesma lista. Com isso, ao alterar uma posição de uma das linhas de A, também alteramos a mesma posição de todas as demais linhas de A. Certamente, esse não é o modo correto de criar e iniciar uma matriz.
Note que o que foi feito acima equivale ao trecho de código (mais curto, mas igualmente semanticamente incorreto) abaixo:

In [4]:
A = [ [0] * 5 ] * 5
print(A)
A[1][1] = 2
print(A)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0], [0, 2, 0, 0, 0]]

O código a seguir mostra a forma correta de se criar A. Note que precisamos usamos um laço (no caso do exemplo, o for) para criar 5 listas contendo 5 elementos cada, sendo que cada uma delas foi adicionada à lista A, correspondendo a uma linha das linhas da matriz A.

In [6]:
A = []
for i in range(5):
   A.append( [0] * 5 )
A[1][1] = 2
print(A)
[[0, 0, 0, 0, 0], [0, 2, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Tópicos vistos na Aula 11

  • Criação e manipulação de matrizes