def decrTwoNr(self, nr1, nr2): ''' decreases two numbers in one of number's base as the user like in: ->nr1,nr2 :number type out: the sum : a number type ''' need = Number("", 10) print("The base can be " + self.__controller.nrIntToString(nr1.get_base()) + " or " + self.__controller.nrIntToString(nr2.get_base()) + "!") base = input("Give the base,on which the operations will be done:\n") try: self.__nrValid.validateBaseInput(need.stringToInt(base), nr1, nr2) base = int(base) if base == nr1.get_base(): nr2.set_number( self.__controller.convertNr(nr2, nr1.get_base()).get_number()) nr2.set_base(base) elif base == nr2.get_base(): nr1.set_number( self.__controller.convertNr(nr1, nr2.get_base()).get_number()) nr1.set_base(base) self.__nrValid.decreasesValidation(nr1.get_number(), nr2.get_number()) return self.__controller.decreaseNumbers(nr1, nr2, base) except commandValidationExceptions as ex: print(ex)
def testOperations(): op = operations() digit = 12 base = 11 d, t = op.verifDigit(digit, base) assert d == 1 and t == 1 nr = 13 assert op.intToString(nr) == 'D' nr1 = "47" nr2 = "55" res = Number("124", 8) assert op.addNumbers(nr1, nr2, 8) == res nr1 = "100" nr2 = "1" res = Number("11", 2) assert op.decreaseNumbers(nr1, nr2, 2) == res nr1 = "B2" nr2 = "B" res = Number("7A6", 16) assert op.mulNumbers(nr1, nr2, 16) == res nr1 = "873" digit = "5" res = Number("167", 9) r = "4" result, rest = op.divD(nr1, digit, 9) assert result == res and r == rest
def validateNr(self, nr, base, errors): ''' validate a number and its digits ''' op = operations() need = Number("", 10) a = need.digits(nr) base = int(base) for i in range(len(a)): self.validateDigitB(a[i], op.intToString(base)) if len(errors): raise validationExceptions(errors)
def addNumbers(self, nr1, nr2, base): ''' add two numbers with a given base in: ->nr1:a string number ->nr2:a string number ->base a int number out:a number type ''' need = Number("", 10) a1 = need.digits(nr1) a2 = need.digits(nr2) t = 0 res = "" while a1 != [] and a2 != []: s = need.stringToInt(a1[-1]) + need.stringToInt(a2[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a1 = a1[:-1] a2 = a2[:-1] while a1 != []: s = need.stringToInt(a1[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a1 = a1[:-1] while a2 != []: s = need.stringToInt(a2[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a2 = a2[:-1] if t != 0: res += self.intToString(t) res = Number(res[::-1], base) return res
def validateDigitB(self, digit, base): ''' validates a digit to be the digit of a specified base digit,base string numbers ''' errors = [] need = Number("", 10) if need.stringToInt(digit) > need.stringToInt(base): errors.append( "Invalid number!The digits must be between 0 and base-1!\n") if digit < '0': errors.append("The digit can't be negative!\n") if len(errors): raise validationExceptions(errors)
def validateDigit(self, digit): ''' validates a digit without taking into account the base ''' errors = [] need = Number("", 10) if need.stringToInt(digit) > 16: errors.append("Invalid digit!The digit must be smaller than 10!\n") if digit < '0': errors.append("The digits of number can't be negative!\n") if not ((ord(digit) <= 57 and ord(digit) >= 48) or (ord(digit) <= 70 and ord(digit) >= 65) or (ord(digit) <= 102 and ord(digit) >= 97)): errors.append("Invalid digit!") if len(errors): raise validationExceptions(errors)
def decreaseNumbers(self, nr1, nr2, base): ''' decreases two numbers in a given base in: ->nr1:string number ->nr2:string number ->base:int number ''' need = Number("", 10) a1 = need.digits(nr1) a2 = need.digits(nr2) t = 0 res = "" while a1 != [] and a2 != []: dif = need.stringToInt(a1[-1]) - need.stringToInt(a2[-1]) - t dif, t = self.verifDigit(dif, base) res += self.intToString(dif) a1 = a1[:-1] a2 = a2[:-1] while a1 != []: dif = need.stringToInt(a1[-1]) - t dif, t = self.verifDigit(dif, base) res += self.intToString(dif) a1 = a1[:-1] while len(res) != 1 and res[-1] == '0': res = res[:-1] res = Number(res[::-1], base) return res
def divD(self, nr, digit, base): ''' multiply a number with a digit in a given base in: ->nr:string number ->digit:a char ->base:int number out:the result (a number type) and the rest a char ''' need = Number("", 10) res = "" a = need.digits(nr) a = a[::-1] d = need.stringToInt(digit) q = need.stringToInt(a[-1]) // d r = need.stringToInt(a[-1]) % d res += self.intToString(q) a = a[:-1] while a != []: r = r * base r += need.stringToInt(a[-1]) q = r // d res += self.intToString(q) r = r % d a = a[:-1] res = res[::-1] while len(res) != 0 and res[-1] == '0': res = res[:-1] res = Number(res[::-1], base) return res, self.intToString(r)
def testFastConversions(): c = conversions() nr = Number("10010111", 2) assert c.fast(nr, 16).get_number() == '97' assert c.fast(nr, 16).get_base() == 16 nr = Number("10010111", 2) assert c.fast(nr, 4).get_number() == '2113' assert c.fast(nr, 4).get_base() == 4 nr = Number("10010111", 2) assert c.fast(nr, 8).get_number() == '227' assert c.fast(nr, 8).get_base() == 8 nr = Number("1123", 4) assert c.fast(nr, 16).get_number() == '5B' assert c.fast(nr, 16).get_base() == 16 nr = Number("1123", 4) assert c.fast(nr, 2).get_number() == '01011011' assert c.fast(nr, 2).get_base() == 2 nr = Number("1123", 16) assert c.fast(nr, 2).get_number() == '0001000100100011' assert c.fast(nr, 2).get_base() == 2 nr = Number("AB", 16) assert c.fast(nr, 4).get_number() == '2223' assert c.fast(nr, 4).get_base() == 4
def divideDDiff(self, nr, digit, base): ''' divide a number with a digit in a given base in: ->number :number type ->digit:a char ->base:int number out: a number type ''' digit = Number(digit, 16) digit = self.__controller.convertNr(digit, base).get_number() return self.__controller.divideNumber(nr, digit, base)
def succesiveDiv(self, nr, base): ''' the succesive division method in: ->nr: number type ->base:an integer number out: the result (a number type) ''' res = "" while nr.get_number() != "": q, r = self.op.divD(nr.get_number(), self.op.nrIntToString(base), nr.get_base()) nr.set_number(q.get_number()) res += r res = Number(res[::-1], base) return res
def mulNumbers(self, nr, digit, base): ''' multiply a number with a digit in a given base in: ->nr:string number ->digit:a char ->base:int number out: a number type ''' need = Number("", 10) d = need.stringToInt(digit) a = need.digits(nr) t = 0 res = "" while a != []: product = need.stringToInt(a[-1]) * d + t product, t = self.verifDigit(product, base) res += self.intToString(product) a = a[:-1] if t != 0: res += self.intToString(t) res = Number(res[::-1], base) return res
def testConversions(): c = conversions() nr = Number("6F", 16) res = Number("111", 10) assert c.substitution(nr, 10) == res nr = Number("111", 10) res = Number("6F", 16) assert c.succesiveDiv(nr, 16) == res nr = Number("179", 10) res = Number("263", 8) assert c.succesiveDiv(nr, 8) == res nr = Number("263", 8) res = Number("179", 10) assert c.substitution(nr, 10) == res nr = Number("263", 8) res = Number("179", 10) assert c.succesiveDiv(nr, 10) == res nr = Number("AB", 13) res = Number("8D", 16) assert c.succesiveDiv(nr, 16) == res
def fast(self, nr, base): ''' convert a number from 2,4,8 in 16 or reverse in: ->nr (number type) ->base (integer type) out: the converted number (number type) ''' switcher={'0':'0000','1':'0001','2':'0010','3':'0011','4':'0100','5':'0101',\ '6':'0110','7':'0111','8':'1000','9':'1001','A':'1010','B':'1011',\ 'C':'1100','D':'1101','E':'1110','F':'1111'} switcher4={'0':'00','1':'01','2':'02','3':'03','4':'10','5':'11',\ '6':'12','7':'13','8':'20','9':'21','A':'22','B':'23',\ 'C':'30','D':'31','E':'32','F':'33'} need = Number("", 10) a = need.digits(nr.get_number()) res = "" if nr.get_base() == 2 or nr.get_base() == 4: p = self.power(base, nr.get_base()) part = 4 - p a = a[::-1] if part != 0: while (len(a) % p) != 0: a += '0' a = a[::-1] while a != []: whole = "" copy = p if nr.get_base() == 4 and base == 2: copy //= 2 while copy != 0: whole += a[-1] copy -= 1 a = a[:-1] whole = whole[::-1] if nr.get_base() == 2: for i in switcher.keys(): if whole == switcher[i][part:4]: res += i break else: for i in switcher4.keys(): if whole == switcher4[i][0:part]: res += i break res = res[::-1] else: p = self.power(nr.get_base(), base) part = 4 - p if (nr.get_base() == 4 or nr.get_base() == 8 or nr.get_base() == 16) and (base == 2 or base == 4): a = a[::-1] while a != []: whole = a[-1] if base == 2: for i in switcher.keys(): if whole == i: res += switcher[i][part:4] break else: for i in switcher4.keys(): if whole == i: res += switcher4[i][0:part] break a = a[:-1] while res != "" and res[0] == '0': res = res[1:] res = Number(res, base) return res
def testNumber(): nr=Number("100",2) assert nr.get_number()=="100" assert nr.get_base()==2 nr.set_number("12") assert nr.get_number()=="12" nr.set_base(10) assert nr.get_base()==10 nr2=Number("12",10) assert nr==nr2 array=nr.digits(nr.get_number()) assert array==["1","2"] char='A' assert nr.modifyChar(char)==10 assert nr.stringToInt(char)==10 char="1" assert nr.stringToInt(char)==1
def run(self): """ Run the console gui """ # print initial help menu print(self._get_help_menu()) while True: option = self._get_command() try: if option == "q": # quit the loop break elif option == "h": # display help print(self._get_help_menu()) elif option == "1": # add two numbers print("Addition") base = self._get_int_command("Base of the numbers: ") number_a = Number(self._get_command("Number a: "), base) number_b = Number(self._get_command("Number b: "), base) print("Result: {0} (base {1})".format(number_a + number_b, base)) elif option == "2": print("Subtraction") base = self._get_int_command("Base of the numbers: ") number_a = Number(self._get_command("Number a(must be larger than b): "), base) number_b = Number(self._get_command("Number b: "), base) print("Result: {0} (base {1})".format(number_a - number_b, base)) elif option == "3": print("Multiplication") base = self._get_int_command("Base of the number: ") number = Number(self._get_command("Number: "), base) scalar = self._get_int_command("Scalar: ") print("Result: {0} (base {1})".format(number * scalar, base)) elif option == "4": print("Division") base = self._get_int_command("Base of the number: ") number = Number(self._get_command("Number: "), base) scalar = self._get_int_command("Scalar: ") quotient, remainder = divmod(number, scalar) print("Quotient = {0} (base {1}), \n Remainder = {2}".format(quotient, base, remainder)) elif option == "5" or option == "6" or option == "7": if option == "5": print("Conversion using substitution") if option == "6": print("Conversion using multiplication and division method") if option == "7": print("Using rapid conversions") source_base = self._get_int_command("Base of the number: ") number = Number(self._get_command("Number: "), source_base) destination_base = self._get_int_command("Destination base: ") if option == "5": number.convert_substitution(destination_base) if option == "6": number.convert_division(destination_base) if option == "7": number.convert_rapid(destination_base) print("Result: {0} (base {1})".format(number, destination_base)) else: print("Option does not exist. Please try again") except NumberException as ex: print(ex)
def substitution(self, nr, base): ''' the substitution method in: ->nr: number type ->base:an integer number out: the result (a number type) ''' res = Number("0", base) need = Number("", base) a1 = [] if need.stringToInt(nr.get_number()) < base: #if the number is smaller than the base then it is a digit for this base res.set_number( self.op.intToString(need.stringToInt(nr.get_number()))) else: a1 = need.digits(nr.get_number()) p = 0 need = Number("", 10) while a1 != []: copy = p strBase = self.op.intToString(nr.get_base()) power = '1' while copy != 0: power = self.op.mulNumbers(power, strBase, base).get_number() copy -= 1 digit = a1[-1] product = self.op.mulNumbers(power, digit, base) p += 1 res.set_number( self.op.addNumbers(res.get_number(), product.get_number(), base).get_number()) a1 = a1[:-1] return res
def show(self): while True: print( " ~ Monica Olanescu 's application ~" ) print("====Main menu====") print("1.Operations") print("2.Conversions") print("0.Exit\n") cmd = input("Give the command:") try: self.__commValid.validateCommand(cmd, 2) cmd = int(cmd) if cmd == 0: break elif cmd == 1: while True: print("--Operations menu--") print("1.Add") print("2.Decrease") print("3.Multiply with a digit") print("4.Division by a digit") print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand(cmd, 4) cmd = int(cmd) if cmd == 0: break elif cmd == 1: print("--Add menu--") print( "1.Add two numbers in one of number's base" ) print("2.Add two numbers in a different base") print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand(cmd, 2) cmd = int(cmd) if cmd == 0: break elif cmd == 1: try: nr = input( "Give the first number:") base = input("Give its base:") nr1 = Number(nr, base) self.__nrValid.validateNumber(nr1) nr1.set_base(int(base)) try: nr = input( "Give the another number:") base = input("Give its base:") nr2 = Number(nr, base) self.__nrValid.validateNumber( nr2) nr2.set_base(int(base)) print("The sum is :" + self.addTwoNr(nr1, nr2). get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 2: try: nr = input( "Give the first number:") base = input("Give its base:") nr1 = Number(nr, base) self.__nrValid.validateNumber(nr1) nr1.set_base(int(base)) try: nr = input( "Give the second number:") base = input("Give its base:") nr2 = Number(nr, base) self.__nrValid.validateNumber( nr2) nr2.set_base(int(base)) base = input( "Give the base on which the operations will be done:" ) try: self.__nrValid.validateBase( base) base = int(base) print("The sum is " + self. addTwoNumberDifBase( nr1, nr2, base ).get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) elif cmd == 2: while True: print("--Decrease menu--") print( "1.Decrease two numbers in one of number's base" ) print( "2.Decrease two numbers in a different base" ) print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand( cmd, 2) cmd = int(cmd) if cmd == 0: break elif cmd == 1: try: nr = input( "Give the first number:") base = input("Give its base:") nr1 = Number(nr, base) self.__nrValid.validateNumber( nr1) nr1.set_base(int(base)) try: nr = input( "Give the another number:" ) base = input( "Give its base:") nr2 = Number(nr, base) self.__nrValid.validateNumber( nr2) nr2.set_base(int(base)) try: print( "The difference is :" + self.decrTwoNr( nr1, nr2 ).get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 2: try: nr = input( "Give the first number:") base = input("Give its base:") nr1 = Number(nr, base) self.__nrValid.validateNumber( nr1) nr1.set_base(int(base)) try: nr = input( "Give the second number:" ) base = input( "Give its base:") nr2 = Number(nr, base) self.__nrValid.validateNumber( nr2) nr2.set_base(int(base)) base = input( "Give the base on which the operations will be done:" ) try: self.__nrValid.validateBase( base) base = int(base) try: self.__nrValid.decreasesValidation( nr1.get_number( ), nr2.get_number( )) print( "The difference is :" + self. decrTwoNumberDifBase( nr1, nr2, base ).get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) elif cmd == 3: while True: print("--Multiply menu--") print( "1.Multiply a number with a digit in the number's base" ) print( "2.Multiply a number with a digit in a different base" ) print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand( cmd, 2) cmd = int(cmd) if cmd == 0: break elif cmd == 1: try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber( nr) nr.set_base(int(base)) try: digit = input( "Give the digit:") self.__nrValid.validateDigitB( digit, base) print("The product is :" + self.multiplyD( nr, digit ).get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 2: try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber( nr) nr.set_base(int(base)) try: digit = input( "Give the digit:") self.__nrValid.validateDigit( digit) base = input( "Give the base on which the operations will be done:" ) try: self.__nrValid.validateBase( base) base = int(base) print( "The product is :" + self.multiplyDiff( nr, digit, base ).get_number()) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) elif cmd == 4: while True: print("--Division menu--") print( "1.Divide a number with a digit in the number's base" ) print( "2.Divide a number with a digit in a different base" ) print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand( cmd, 2) cmd = int(cmd) if cmd == 0: break elif cmd == 1: try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber( nr) nr.set_base(int(base)) try: digit = input( "Give the digit:") self.__nrValid.validateDigitB( digit, base) q, r = self.divideD( nr, digit) print( "The quotient is :" + q.get_number() + " and the remainder:" + r + ".\n") except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 2: try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber( nr) nr.set_base(int(base)) try: digit = input( "Give the digit:") self.__nrValid.validateDigit( digit) base = input( "Give the base on which the operations will be done:" ) try: self.__nrValid.validateBase( base) base = int(base) q, r = self.divideDDiff( nr, digit, base) print( "The quotient is :" + q.get_number() + " and the remainder:" + r + ".\n") except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) elif cmd == 2: while True: print("--Conversions menu--") print("1.Successive division method") print("2.Substitution method") print("3.Fast conversions between 2,4,16 base") print("4.Conversions with an intermediary base") print("0.Back\n") cmd = input("Give the command:") try: self.__commValid.validateCommand(cmd, 4) cmd = int(cmd) if cmd == 0: break elif cmd == 1: print( "Successive division method works better when the number's base is bigger than the base on which we want to convert!" ) try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber(nr) nr.set_base(int(base)) try: base = input( "Give the base in which the number will be converted:" ) self.__nrValid.validateBase(base) base = int(base) self.__methValid.validateDivision( nr, base) print("The converted number is " + self.convertDiv( nr, base).get_number() + "!\n") except methodExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 2: print( "Substitution method works better when the number's base is bigger than the base on which we want to convert!" ) try: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) self.__nrValid.validateNumber(nr) nr.set_base(int(base)) try: base = input( "Give the base in which the number will be converted:" ) self.__nrValid.validateBase(base) base = int(base) self.__methValid.validateSubstition( nr, base) print("The converted number is " + self.convertSubstitution( nr, base).get_number() + "!\n") except validationExceptions as ex: print(ex) except methodExceptions as ex: print(ex) except validationExceptions as ex: print(ex) elif cmd == 3: print( "Fast conversions works only between 2,4,8 and 16 base!" ) print( "Take care to have every time a base as a power to the other one!\n Ex: 4=2^2 ; 8=2^3 ;16=4^2 \n " ) nr = input("Give the number:") base = input("Give the base:") nr = Number(nr, base) try: self.__nrValid.validateNumber(nr) base = int(base) nr.set_base(base) try: base = input( "Give the base in which the number will be converted:" ) self.__nrValid.validateBase(base) base = int(base) self.__methValid.validateBasesFast( base, nr.get_base()) self.__methValid.validateFast(base) print("The converted number is " + self.fastConversions( nr, base).get_number() + "!\n") except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except methodExceptions as ex: print(ex) elif cmd == 4: nr = input("Give the number:") base = input("Give its base:") nr = Number(nr, base) try: self.__nrValid.validateNumber(nr) base = int(base) nr.set_base(base) try: intermediary = input( "Give the intermediary base:") self.__nrValid.validateBase( intermediary) intermediary = int(intermediary) base = input( "Give the base in which the number will be converted:" ) self.__nrValid.validateBase(base) base = int(base) intermediaryNumber, finalNumber = self.conversionsIntermediaryBase( nr, intermediary, base) print( "The converted number in intermediary base is: " + intermediaryNumber.get_number() + "!") print("The converted number is " + finalNumber.get_number() + "!\n") except validationExceptions as ex: print(ex) except validationExceptions as ex: print(ex) except methodExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex) except commandValidationExceptions as ex: print(ex)