MAC2166 - Introdução à Computação

30/03/2017 - Aula 6

Problema 6.1

Escreva um programa que leia dois inteiros m e n e calcula o coeficiente binomial

m!/(n!(m-n)!)

ou seja, um programa que calcule quantas formas distintas é possível escolher n elementos de um grupo de m elementos.

Primeira tentativa de solução

In [2]:
def main():
    """
    primeira versão do programa que calcula m! / (n! (m - n)!)
    """

    print("Cálculo de binomial(m, n)")
    m = int(input("Digite o valor de m:"))
    n = int(input("Digite o valor de n:"))

    fatm = 1
    cont = 1
    while cont <= m:
        fatm *= cont
        cont += 1

    fatn = 1
    cont = 1
    while cont <= n:
        fatn *= cont
        cont += 1

    fatmn = 1
    cont = 1
    while cont <= (m-n):
        fatmn *= cont
        cont += 1

    binomial = fatm / (fatn * fatmn)
    print ("binomial(%d, %d) = %d" %(m, n, binomial))
    

# início da execução do programa
main()
Cálculo de binomial(m, n)
Digite o valor de m:3
Digite o valor de n:2
binomial(3, 2) = 3

Solução melhor

In [3]:
def main():
    """
    Segunda versão do programa que calcula m! / (n! (m - n)!) 
    (usando a função fatorial)
    """

    print("Calculo de binomial(m, n)")
    m = int(input("Digite o valor de m:"))
    n = int(input("Digite o valor de n:"))

    binomial = fatorial(m) / (fatorial(n) * fatorial(m-n))
    print ("Binomial(%d, %d) = %d" %(m, n, binomial))

#-----------------------------------------------------
def fatorial(k):
    '''(int) -> int

    Recebe um inteiro k e retorna o valor de k!

    Pre-condicao: supõe que k é um número inteiro não negativo.
    '''

    k_fat = 1
    i = 2
    while i <= k:
        k_fat *= i
        i += 1

    return k_fat


# início da execução do programa
main()
Calculo de binomial(m, n)
Digite o valor de m:3
Digite o valor de n:2
Binomial(3, 2) = 3

Solução com ainda mais funções

In [4]:
def main():
    """
    Terceira versão do programa que calcula m! / (n! (m - n)!) 
    (usando as funções binomial e fatorial)
    """

    print("Calculo de binomial(m, n)")
    m = int(input("Digite o valor de m:"))
    n = int(input("Digite o valor de n:"))

    print ("binomial(%d, %d) = %d" %(m, n, binomial(m,n)))
    
    
#-----------------------------------------------------
def binomial(m,n):
    '''(int,int) -> int

    Recebe dois inteiros m e n e retorna o valor da
    combinacao de m n-a-n.

    Utiliza a função fatorial().

    Pré-condição: supõe que m e n são números inteiros não negativos.
    '''

    return fatorial(m)/(fatorial(m-n)*fatorial(n))

#-----------------------------------------------------
def fatorial(k):
    '''(int) -> int

    Recebe um inteiro k e retorna o valor de k!

    Pre-condicao: supõe que k é um número inteiro não negativo.
    '''

    k_fat = 1
    i = 2
    while i <= k:
        k_fat *= i
        i += 1

    return k_fat


# início da execução do programa
main()
Calculo de binomial(m, n)
Digite o valor de m:3
Digite o valor de n:2
binomial(3, 2) = 3

Logo no início das funções main, fat e binomial que criamos, é possível ver um comentário de bloco. Esse tipo de comentário no início de uma função é chamado de docstring, e seu objetivo é documentar a função.

Um docstring deve conter a informação que é essencial de se saber para alguém que quer usar a função. Ele deve explicar de forma concisa o quê a função faz, mas sem entrar em detalhes sobre como isso é feito. Ele deve dizer o significado de cada parâmetro de entrada e também o seu tipo esperado (quando necessário). O docstring deve dizer também o que a função devolve como valor de retorno.

Podemos ver o docstring de uma função usando a função help, como no exemplo abaixo:

In [5]:
help(fatorial)
Help on function fatorial in module __main__:

fatorial(k)
    (int) -> int
    
    Recebe um inteiro k e retorna o valor de k!
    
    Pre-condicao: supõe que k é um número inteiro não negativo.


Problema 6.2

Faça um programa que lê um numero inteiro n > 0 e imprime os coeficientes da expansão de (a+b)n .

In [6]:
def main():
    """
    Programa que mostra os coeficientes de (a + b) ** n
    """
    
    print("Cálculo dos coeficientes de (a + b) ** n")
    n = int(input("Digite o valor de n:"))

    p = 0
    while p <= n:
        print("coef do termo a^(%d).b^(%d) = %d" %(n-p, p, binomial(n, p)))
        p += 1


#-----------------------------------------------------
def binomial(m,n):
    '''(int,int) -> int

    Recebe dois inteiros m e n e retorna o valor da
    combinacao de m n-a-n.

    Utiliza a função fatorial().

    Pré-condição: supõe que m e n são números inteiros não negativos.
    '''

    return fatorial(m)/(fatorial(m-n)*fatorial(n))

#-----------------------------------------------------
def fatorial(k):
    '''(int) -> int

    Recebe um inteiro k e retorna o valor de k!

    Pre-condicao: supõe que k é um número inteiro não negativo.
    '''

    k_fat = 1
    i = 2
    while i <= k:
        k_fat *= i
        i += 1

    return k_fat


# início da execução do programa
main()
Cálculo dos coeficientes de (a + b) ** n
Digite o valor de n:5
coef do termo a^(5).b^(0) = 1
coef do termo a^(4).b^(1) = 5
coef do termo a^(3).b^(2) = 10
coef do termo a^(2).b^(3) = 10
coef do termo a^(1).b^(4) = 5
coef do termo a^(0).b^(5) = 1

Problema 6.3

Faça um programa que lê um numero inteiro n > 0 e imprime as n primeiras linhas do triângulo de Pascal.

In [7]:
def main():
    """
    Programa que imprime as n primeiras linhas do triângulo de Pascal
    """
    n = int(input("Digite o valor de n: "))

    i = 0
    while i < n:
        p = 0
        while p <= i:           # Observe que este laço está dentro de outro laço!!!
            print(binomial(i,p), end = "\t")
            p += 1
        
        i += 1
        print()

#-----------------------------------------------------
def binomial(m,n):
    '''(int,int) -> int

    Recebe dois inteiros m e n e retorna o valor da
    combinacao de m n-a-n.

    Utiliza a função fatorial().

    Pré-condição: supõe que m e n são números inteiros não negativos.
    '''

    return fatorial(m)/(fatorial(m-n)*fatorial(n))

#-----------------------------------------------------
def fatorial(k):
    '''(int) -> int

    Recebe um inteiro k e retorna o valor de k!

    Pre-condicao: supõe que k é um número inteiro não negativo.
    '''

    k_fat = 1
    i = 2
    while i <= k:
        k_fat *= i
        i += 1

    return k_fat


# início da execução do programa
main()
Digite o valor de n: 5
1.0	
1.0	1.0	
1.0	2.0	1.0	
1.0	3.0	3.0	1.0	
1.0	4.0	6.0	4.0	1.0	

Tópicos vistos na Aula 6

  • Introdução à criação de funções: comandos def e return
  • Documentando funções com docstring