Jump to content

Calculadora aritmética em Python


matesteves
Go to solution Solved by thoga31,

Recommended Posts

Estou a escrever um código de uma calculadora de multiplicação que deve usar apenas operadores aritméticos, no intervalo de "-10 >= x <= 10" e deve sempre fazer as contas sob a melhor performance possível, ex.: "3x2 = 3 + 3" e não "3x2 = 2 + 2 + 2", sem usar nenhum tipo de "while" ou "for", só posso usar os operadores + e -. Eu montei a calculadora, porém eu não consigo fazê-la funcionar na maneira mais otimizada e nem quando "s" é menor que 0, que são os meus maiores problemas. Além disso, preciso dar print nos intermediários da conta, por exemplo: "3 x 10" eu teria que dar um print de algo parecido com: "10; 20; 30" e não faço ideia de como fazer isso. Agradeço qualquer ajuda, estou bem enrolado com isso.

def erro_numero():
    print(' ')
    print('O número deve ser igual ou estar entre -10 e 10.')


def erro_letra():
    print(' ')
    print('O valor deve ser um número inteiro.')


def erro_0():
    print(' ')
    print('Não é possível dividir por zero.')


def primeiro_numero():
    try:
        x = int(input('Digite o valor do primeiro número: '))
        if x < -10 or x > 10:
            erro_numero()
            return primeiro_numero()
        else:
            return x

    except:
        erro_letra()
        return primeiro_numero()


def segundo_numero():
    try:
        z = int(input('Digite o valor do segundo número: '))
        if z < -10 or z > 10:
            erro_numero()
            return segundo_numero()
        else:
            return z
    except:
        erro_letra()
        return segundo_numero()


def multiplica(p, s, resultado_parcial=0):
    if s == 0:
        return resultado_parcial
    resultado_parcial = resultado_parcial + p
    return multiplica(p, s - 1, resultado_parcial)
          
def operacao(pro):
          print('O valor do produto é:', pro)
          
          
while True:             #Isto aqui é só para fazer rodar o programa
    p = primeiro_numero()
    s = segundo_numero()
    pro = multiplica(p, s, resultado_parcial=0)
    operacao(pro)
Link to comment
Share on other sites

  • Solution

Antes de mais, permite-me algumas dicas gerais:

  1. Podes usar a mesma função para ler os dois números. Se reparares com atenção, primeiro_numer() e segundo_numero() são exactamente a mesma função, apenas com nomes de variáveis diferentes no interior (x vs z). E se tivesses de ler 10 números? Não irias criar 10 funções. Portanto, cria uma função única que leia um número entre -1 e 10.
  2. Se podes usar a estrutura try-except, sugiro levantar excepções na função de leitura do número e apanha as excepções onde invocas essa mesma função. Esta dica não é, contudo, da maior importância, pelo que é seguro ignorar se quiseres.

 

Quanto ao problema em específico, tens de ter em consideração alguns pormenores:

  1. Terás de tratar de forma diferente os casos em que os números são negativos com recurso a condições;
  2. Poderás ter de considerar o caso especial da multiplicação de 0 por 0;
  3. Antes de cada chamada recursiva, faz um print do resultado parcial actual;
  4. De forma a considerar bem qual o maior e menor valor, passa os valores à função de tal forma que garantas que, por exemplo, o primeiro argumento seja sempre maior ou igual que o segundo - isto deverá permitir generalizar e facilitar o código da função de multiplicação.

Neste sentido, sugiro este esqueleto:

def multiplica(p, s, r=0):
  # Se p e s são 0, devolve 0
  # Caso contrário:
  if s > 0:
    r += p
    print(r)
    return multiplica(p, s-1, r)
  elif s < 0:
    # to-do
  else:
    return r

Cumprimentos.

  • Vote 1

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.