Menu
CoddyTech

Operator tingkat satu

Pelajaran 13 dari 29 dalam kursus Proyek kalkulator dengan Python di Coddy.

Seperti yang telah kita bahas sebelumnya, dalam matematika ada urutan operasi.

Operator '*', '/', dan '%' dihitung sebelum '+' dan '-'.

Dalam kursus ini, kita menyebut operator '*', '/', dan '%' sebagai operator tingkat satu.

Operator '+' dan '-' disebut operator tingkat dua.

challenge icon

Tantangan

Mudah

Saat ini struct hanya mendukung operator level dua.

Tugasmu adalah menambahkan dukungan untuk operator level satu pada struct.

Pastikan urutan perhitungannya benar!

Contoh:

  • struct([3, '*', 2])  ->  ['*', 3, 2]
  • struct([1, '+', 2, 'mul', 3])  ->  ['+', 1, ['mul', 2, 3]]
  • struct([2, 'mod', 3, '-', 4, '/', 5.2])  ->  ['-', ['mod', 2, 3], ['/', 4, 5.2]]

Coba sendiri

def calc(op, n1, n2=None):
    if not isinstance(n1, int) and not isinstance(n1, float):
        raise Exception('Invalid number "' + str(n1) + '"')

    if n2 is None:
        if op == '+' or op == 'add':
            return n1
        if op == '-' or op == 'sub':
            return -n1

        raise Exception('Invalid operator "' + op + '"')

    if not isinstance(n2, int) and not isinstance(n2, float):
        raise Exception('Invalid number "' + str(n2) + '"')

    if op == '+' or op == 'add':
        return n1 + n2
    if op == '-' or op == 'sub':
        return n1 - n2
    if op == '*' or op == 'mul':
        return n1 * n2
    if op == '/' or op == 'div':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 / n2
    if op == '%' or op == 'mod':
        if n2 == 0:
            raise Exception("Division by zero")
        return n1 % n2
    if op == '^' or op == 'pow':
        return n1 ** n2

    raise Exception('Invalid operator "' + op + '"')


def eval(lst):
    if not isinstance(lst, list):
        raise Exception('Failed to evaluate "' + str(lst) + '"')
    if len(lst) == 2:
        op = lst[0]
        n = lst[1]
        if not isinstance(n, list):
            return calc(op, n)

        if isinstance(n, list):
            n = eval(n)

        return calc(op, n)
    elif len(lst) == 3:
        op = lst[0]
        n1 = lst[1]
        n2 = lst[2]
        if not isinstance(n1, list) and not isinstance(n2, list):
            return calc(op, n1, n2)
        
        if isinstance(n1, list):
            n1 = eval(n1)
        if isinstance(n2, list):
            n2 = eval(n2)

        return calc(op, n1, n2)
    else:
        raise Exception('Failed to evaluate "' + str(lst) + '"')


OPERATORS = ['+', '-', 'add', 'sub']
def struct(lst):
    i = 0
    while i < len(lst):
        if lst[i] in OPERATORS:
            if len(lst) == 3:
                return [lst[i], lst[i - 1], lst[i + 1]]
            temp = lst[:i - 1]
            temp.append([lst[i], lst[i - 1], lst[i + 1]])
            temp += lst[i + 2:]
            lst = temp
        else:
            i += 1
    return lst

Semua pelajaran di Proyek kalkulator dengan Python

Latihan sendiri: Compiler Python online