MAC2166 - Introdução à Computação

18/05/2017 - Aula 16 - Revisão para a P2

Problema 16.1

a) Crie uma função que, dados como parâmetro uma lista de registros de produtos ordenada crescentemente por nome de produto e um novo registro de produto, insere o novo registro na lista de forma a manter a ordenação. Um registro de produto é uma lista na forma ["nome do produto", "cor", preço]. Exemplo de registro de produto:

["Tênis New Balas", "pink", "359.99"]

b) Escreva um programa que lê uma sequência de registros de produtos e depois os exibe em ordem crescente de nome de produto.

In [2]:
def insere_ordenado(lista_produtos, novo_produto):
    n = len(lista_produtos)
    
    i = 0
    # encontra a posição onde o novo produto deve ficar na lista
    while  i < n and lista_produtos[i][0] < novo_produto[0]:
        i += 1

    # aqui, i contém a posição onde o novo produto deve entrar na lista

    lista_produtos.append([])

    # desloca os elementos a partir da posiçao i uma posição a frente,
    # para "abrir espaço" para o novo produto
    k = len(lista_produtos) - 1  #  é igual a  k = n
    while k > i:
        lista_produtos[k] = lista_produtos[k-1]
        k -= 1

    # guarda o novo produto na posição correta
    lista_produtos[i] = novo_produto


def main():
    
    n = int(input("Digite o numero de produtos que serao fornecidos: "))

    prods = []
    for i in range(n):
        print("*** Produto numero %d ***" %(i+1))
        produto = []
        produto.append(input("Digite o nome do produto: "))
        produto.append(input("Digite a cor do produto: "))
        produto.append(float(input("Digite o preco do produto: ")))

        insere_ordenado(prods, produto)

    for produto in prods:         # igual a :   for i in range(len(prods)): 
        print(produto)            #                 print(prods[i])

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

    
Digite o numero de produtos que serao fornecidos: 4
*** Produto numero 1 ***
Digite o nome do produto: Banana Maçã
Digite a cor do produto: amarelo
Digite o preco do produto: 5.90
*** Produto numero 2 ***
Digite o nome do produto: Abacaxi
Digite a cor do produto: verde
Digite o preco do produto: 6.30
*** Produto numero 3 ***
Digite o nome do produto: Morango
Digite a cor do produto: vermelho
Digite o preco do produto: 8.99
*** Produto numero 4 ***
Digite o nome do produto: Banana Ouro
Digite a cor do produto: amarelo
Digite o preco do produto: 4.50
['Abacaxi', 'verde', 6.3]
['Banana Maçã', 'amarelo', 5.9]
['Banana Ouro', 'amarelo', 4.5]
['Morango', 'vermelho', 8.99]

Problema 16.2

Dizemos que uma matriz quadrada inteira é um quadrado máqgico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais. Exemplo de matriz quadrado-mágico:

807
456
3102

Faça um programa que , dados um inteiro positivo n (n >= 1) e uma matriz quadrada An x n , verificar se A é quadrado mágico.

In [3]:
def main():
    n = int(input("Digite o numero de linhas da matriz A: "))
    A = le_matriz(n,n)

    # Verifica se matriz tem linhas ou colunas compostas por zeros

    quadrado_magico = True
    
    # A soma de referência será a soma dos números da linha 1 de A
    soma_referencia = 0
    for numero in A[0]:
        soma_referencia += numero  
    
    # Verifica se a soma de cada uma das demais linhas dá igual à soma de referência
    i = 1
    while quadrado_magico and i < n:    # Percorre as linhas de A a partir da segunda linha
        soma_linha = 0
        for numero in A[i]:   # Para cada número na linha A[i], faça
            soma_linha += numero   # acrescente o número na soma da linha A[i]
            
        if soma_linha != soma_referencia:
            quadrado_magico = False
            
        i += 1

    # Verifica se a soma de cada uma das colunas dá igual à soma de referência
    j = 0
    while j < n and quadrado_magico:   # Percorre as colunas de A
        soma_coluna = 0
        for i in range(n):              # Percorre as linhas de uma dada coluna
            soma_coluna += A[i][j]
        
        if soma_coluna != soma_referencia:
            quadrado_magico = False
        
        j += 1

        
    # obtém  a soma de cada uma das diagonais
    soma_diagonal_principal = 0
    soma_diagonal_secundaria = 0

    k = 0
    while quadrado_magico and k < n:
        soma_diagonal_principal += A[k][k]
        soma_diagonal_secundaria += A[k][n-k-1]
        k += 1

    if soma_diagonal_principal != soma_referencia or soma_diagonal_secundaria != soma_referencia:
            quadrado_magico = False

    if quadrado_magico:
        print("A matriz é um quadrado magico! :) ")
    else:
        print("A matriz não é um quadrado magico! :( ")

    
def le_matriz(m, n):
    """
    (int, int) --> list
    
    Funçao 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 
    de 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ç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

#########################
main()
Digite o numero de linhas da matriz A: 3
Digite os elementos da matriz de tamanho 3x3:
Elemento da 1a. linha, 1a. coluna: 8
Elemento da 1a. linha, 2a. coluna: 0
Elemento da 1a. linha, 3a. coluna: 7
Elemento da 2a. linha, 1a. coluna: 4
Elemento da 2a. linha, 2a. coluna: 5
Elemento da 2a. linha, 3a. coluna: 6
Elemento da 3a. linha, 1a. coluna: 3
Elemento da 3a. linha, 2a. coluna: 10
Elemento da 3a. linha, 3a. coluna: 2
A matriz é um quadrado magico! :)