diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..14de595 Binary files /dev/null and b/.DS_Store differ diff --git a/calctests.py b/calctests.py deleted file mode 100644 index 1964570..0000000 --- a/calctests.py +++ /dev/null @@ -1,25 +0,0 @@ -import unittest -from calculator import Calculator - - -class TestStringMethods(unittest.TestCase): - - def test_add(self): - c = Calculator() - self.assertEqual(c.add(3, 3), 6) - - def test_add2(self): - c = Calculator() - self.assertEqual(c.add(12, -10), 2) - - def test_add3(self): - c = Calculator() - self.assertEqual(c.add(5, 8), 13) - - def test_sub(self): - c = Calculator() - self.assertEqual(c.sub(9, 3), 6) - - -if __name__ == '__main__': - unittest.main() diff --git a/calculator.py b/calculator.py index 3c85ead..d7a0bbb 100644 --- a/calculator.py +++ b/calculator.py @@ -1,12 +1,108 @@ +import math + + class Calculator: def __init__(self): pass - def add(self, x, y): - return x + y + def add(self, num1, num2): + answer = num1 + num2 + return answer + + def sub(self, num1, num2): + answer = num1 - num2 + return answer + + def mul(self, num1, num2): + answer = num1 * num2 + return answer + + def div(self, num1, num2): + if num2 != 0: + answer = (num1 / num2) + return answer + + def powerof(self, num, raiseby): + answer = math.pow(num, raiseby) + return answer + + def square(self, num): + answer = math.pow(num, 2) + return answer + + def squareroot(self, num): + answer = math.sqrt(num) + return answer + + def inverse(self, num): + answer = 1/(num) + return answer + + def switchsign(self, num): + answer = num*(-1) + return answer + + def sinrad(self, num): + answer = math.sin(num) + return answer + + def cosrad(self, num): + answer = math.cos(num) + return answer + + def tanrad(self, num): + answer = math.tan(num) + return answer + + def cosecrad(self, num): + answer = 1/(math.sin(num)) + return answer + + def secrad(self, num): + answer = 1/(math.cos(num)) + return answer + + def cotrad(self, num): + answer = 1/(math.tan(num)) + return answer + + def sindeg(self, num): + answer = math.sin(math.radians(num)) + return answer + + def cosdeg(self, num): + answer = math.cos(math.radians(num)) + return answer + + def tandeg(self, num): + answer = math.tan(math.radians(num)) + return answer + + def cosecdeg(self, num): + answer = 1/(math.sin(math.radians(num))) + return answer + + def secdeg(self, num): + answer = 1/(math.cos(math.radians(num))) + return answer + + def cotdeg(self, num): + answer = 1/(math.tan(math.radians(num))) + return answer + + def factorial(self, num): + answer = math.factorial(num) + return answer + + def ln(self, num): + answer = math.log(num) + return answer - def sub(self, x, y): - return 0 + def logten(self, num): + answer = math.log10(num) + return answer -# add lots more methods to this calculator class. + def logbasex(self, num, x): + answer = math.log(num, x) + return answer \ No newline at end of file diff --git a/main-app.py b/main-app.py index a7cc4e2..8c7cc54 100644 --- a/main-app.py +++ b/main-app.py @@ -1,34 +1,364 @@ from calculator import Calculator +import decimal +import math +global mem +mem = 0 + +def getFirstNumber(): + a = input("first number? ") + while type(a) == str: + try: + a = float(a) + except ValueError: + print("Error: Please Enter Valid number\n") + a = getFirstNumber() + return a + +def getSecondNumber(): + b = input("second number? ") + while type(b) == str: + try: + b = float(b) + except ValueError: + print("Error: Please Enter Valid number\n") + b = getSecondNumber() + return b def getTwoNumbers(): - a = float(input("first number? ")) - b = float(input("second number? ")) + a = getFirstNumber() + b = getSecondNumber() return a, b def displayResult(x: float): print(x, "\n") + return x +def printOptions(): + print("List of choice:") + print('-' * 60) + print("Add\t \t\t Sine in degrees") + print("Subtract \t \t Cosine in degrees") + print("Multipy \t \t Tan in degrees") + print("Division \t\t Cosecant in degrees") + print("Sine in radians \t Secant in degrees") + print("Cosine in radians \t Cotangent in degrees") + print("Tangent in radians \t Natural log") + print("Cosecant in radians \t Base 10 log") + print("Secant in radians \t Log base'x'") + print("Cotangent in radians \t Square root") + print("Squared \t\t Exponent") + print("Inverse \t\t Switch sign") + print("Factorial \t\t") + print("B : For Binary View \t O : For Octal View") + print("D : For Decimal View\t H : For Hexidecimal View") + print("R: Degree to Radians\t D: Radians to Degrees") + print("M+ : Add to Memory MRC : Add Memory to Display") + print("MRC: Set Memory to 0") + -def performCalcLoop(calc): +def performFirstCalcLoop(calc): while True: + printOptions() + print("q to quit") + print('-' * 60) choice = input("Operation? ") if choice == 'q': break # user types q to quit calulator. - elif choice == 'add': + elif choice == 'Add': + a, b = getTwoNumbers() + x = displayResult(calc.add(a, b)) + + elif choice == 'Subtract': + a, b = getTwoNumbers() + x = displayResult(calc.sub(a, b)) + + elif choice == 'Multiply': a, b = getTwoNumbers() - displayResult(calc.add(a, b)) + x = displayResult(calc.mul(a, b)) + + elif choice == 'Division': + a, b = getTwoNumbers() + if b != 0: + x = displayResult(calc.div(a, b)) + else: + print("Cannot Divide by zero") + performFirstCalcLoop(calc) + + elif choice == 'Exponent': + print("First number is base, Second is Exponent") + a, b = getTwoNumbers() + x = displayResult(calc.powerof(a, b)) + + elif choice == 'Squared': + a = getFirstNumber() + x = displayResult(calc.square(a)) + + elif choice == 'Square root': + a = getFirstNumber() + x = displayResult(calc.squareroot(a)) + + elif choice == 'Inverse': + a = getFirstNumber() + x = displayResult(calc.inverse(a)) + + elif choice == 'Switch sign': + a = getFirstNumber() + x = displayResult(calc.switchsign(a)) + + elif choice == 'Sine in radians': + a = getFirstNumber() + x = displayResult(calc.sinrad(a)) + + elif choice == 'Cosine in radians': + a = getFirstNumber() + x = displayResult(calc.cosrad(a)) + + + elif choice == 'Tangent in radians': + a = getFirstNumber() + x = displayResult(calc.tanrad(a)) + + elif choice == 'Cosecant in radians': + a = getFirstNumber() + x = displayResult(calc.cosecrad(a)) + + elif choice == 'Secant in radians': + a = getFirstNumber() + x = displayResult(calc.secrad(a)) + + elif choice == 'Cotangent in radians': + a = getFirstNumber() + x = displayResult(calc.cotrad(a)) + + elif choice == 'Sine in degrees': + a = getFirstNumber() + x =displayResult(calc.sindeg(a)) + + elif choice == 'Cosine in degrees': + a = getFirstNumber() + x = displayResult(calc.cosdeg(a)) + + elif choice == 'Tangent in degrees': + a = getFirstNumber() + x = displayResult(calc.tandeg(a)) + + elif choice == 'Cosecant in degrees': + a = getFirstNumber() + x = displayResult(calc.cosecdeg(a)) + + elif choice == 'Secant in degrees': + a = getFirstNumber() + x = displayResult(calc.secdeg(a)) + + elif choice == 'Cotangent in degrees': + a = getFirstNumber() + x = displayResult(calc.cotdeg(a)) + + elif choice == 'Factorial': + a = getFirstNumber() + x = displayResult(calc.factorial(a)) + + elif choice == 'Natural log': + a = getFirstNumber() + x = displayResult(calc.ln(a)) + + elif choice == 'Base 10 log': + a = getFirstNumber() + x = displayResult(calc.logten(a)) + + elif choice == 'Log base x': + print("Second number is log base") + a, b = getTwoNumbers() + x = displayResult(calc.logbasex(a,b)) + elif choice == 'B': + a = getFirstNumber() + x = displayResult(bin(int(a))) + x = a + + elif choice == 'O': + a = getFirstNumber() + x = displayResult(oct(int(a))) + x = a + + elif choice == 'D': + a = getFirstNumber() + x = displayResult(decimal.Decimal(a)) + x = a + + elif choice == 'H': + a = getFirstNumber() + x = displayResult(hex(int(a))) + x = a + + elif choice == 'R': + a = getFirstNumber() + x = displayResult(math.degrees(a)) + + elif choice == 'D': + a = getFirstNumber() + x = displayResult(math.radians(a)) + + elif choice == 'M+': + global mem + mem = x + + elif choice == "MC": + mem = 0 + + elif choice == "MRC": + x = mem + + else: + print("That is not a valid input.") + performFirstCalcLoop(calc) + + performCalcLoop(calc, x) + +def performCalcLoop(calc,a): + x = a + while True: + printOptions() + + print("c to clear") + print('-' * 60) + print(str(a) + " is your first number\n") + choice = input("Operation? ") + if choice == 'c': + break # user types q to quit calulator. + elif choice == 'Add': + b = getSecondNumber() + x = displayResult(calc.add(a, b)) + + elif choice == 'Subtract': + a, b = getTwoNumbers() + x = displayResult(calc.sub(a, b)) + + elif choice == 'Multiply': + b = getSecondNumber() + x = displayResult(calc.mul(a, b)) + + elif choice == 'Division': + b = getSecondNumber() + if b != 0: + x = displayResult(calc.div(a, b)) + else: + print("Cannot Divide by Zero") + performCalcLoop(calc,a) + + elif choice == 'Exponent': + print("First number is base, Second is Exponent") + b = getSecondNumber() + x = displayResult(calc.powerof(a, b)) + + elif choice == 'Squared': + x = displayResult(calc.square(a)) + + elif choice == 'Square root': + a = getFirstNumber() + x = displayResult(calc.squareroot(a)) + + elif choice == 'Inverse': + x = displayResult(calc.inverse(a)) + + elif choice == 'Switch sign': + x = displayResult(calc.switchsign(a)) + + elif choice == 'Sine in radians': + x = displayResult(calc.sinrad(a)) + + elif choice == 'Cosine in radians': + x = displayResult(calc.cosrad(a)) + + + elif choice == 'Tangent in radians': + x = displayResult(calc.tanrad(a)) + + elif choice == 'Cosecant in radians': + x = displayResult(calc.cosecrad(a)) + + elif choice == 'Secant in radians': + x = displayResult(calc.secrad(a)) + + elif choice == 'Cotangent in radians': + x = displayResult(calc.cotrad(a)) + + elif choice == 'Sine in degrees': + x =displayResult(calc.sindeg(a)) + + elif choice == 'Cosine in degrees': + x = displayResult(calc.cosdeg(a)) + + elif choice == 'Tangent in degrees': + x = displayResult(calc.tandeg(a)) + + elif choice == 'Cosecant in degrees': + x = displayResult(calc.cosecdeg(a)) + + elif choice == 'Secant in degrees': + x = displayResult(calc.secdeg(a)) + + elif choice == 'Cotangent in degrees': + x = displayResult(calc.cotdeg(a)) + + elif choice == 'Factorial': + x = displayResult(calc.factorial(a)) + + elif choice == 'Natural log': + x = displayResult(calc.ln(a)) + + elif choice == 'Base 10 log': + x = displayResult(calc.logten(a)) + + elif choice == 'B': + x = displayResult(bin(int(a))) + x = a + + elif choice == 'O': + x = displayResult(oct(int(a))) + x = a + + elif choice == 'D': + x = displayResult(decimal.Decimal(a)) + x = a + + elif choice == 'H': + x = displayResult(hex(int(a))) + x = a + + elif choice == 'R': + x = displayResult(math.degrees(a)) + + elif choice == 'D': + x = displayResult(math.radians(a)) + + elif choice == 'M+': + global mem + mem = x + + elif choice == "MC": + mem = 0 + + elif choice == "MRC": + x = mem + + elif choice == 'Log base x': + print("Second number is log base") + b = getSecondNumber() + x = displayResult(calc.logbasex(a,b)) + else: print("That is not a valid input.") + performCalcLoop(calc, x) # main start def main(): calc = Calculator() - performCalcLoop(calc) + performFirstCalcLoop(calc) print("Done Calculating.") if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/test_main-app.py b/test_main-app.py new file mode 100644 index 0000000..4d9612c --- /dev/null +++ b/test_main-app.py @@ -0,0 +1,106 @@ +import unittest +from calculator import Calculator + + +class TestStringMethods(unittest.TestCase): +c = Calculator() + + def test_add(self): + self.assertEqual(c.add(3, 3), 6) + self.assertEqual(c.add(12, -10), 2) + self.assertEqual(c.add(5, 8), 13) + + def test_sub(self): + self.assertEqual(c.sub(9, 3), 6) + self.assertEqual(c.sub(-4, 3), -7) + self.assertEqual(c.sub(123.2, .2), 123) + + def test_mul(self): + self.assertEqual(c.mul(4, .5), 2) + self.assertEqual(c.mul(5, 5), 25) + self.assertEqual(c.mul(10, -1), -10) + + def test_div(self): + self.assertEqual(c.div( 25,5 ), 5) + self.assertEqual(c.div( 10,-2 ),-5) + self.assertEqual(c.div( 10,-2 ),-5) + self.assertEqual(c.div( 10,-2 ),-5) + + def test_powerof(self): + c = Calculator() + self.assertEqual(c.powerof(10, 5), 100000) + self.assertEqual(c.powerof(10, -2), .01) + + def test_square(self): + self.assertEqual(c.square(10), 100) + self.assertEqual(c.square(-10), 100) + self.assertEqual(c.square(0), 0) + + def test_squarert(self): + c = Calculator() + self.assertEqual(c.squareroot(25), 5) + self.assertEqual(c.squareroot(100), 10) + + def test_sinrad(self): + c = Calculator() + self.assertEqual(c.sinrad(3), 0.14112001) + self.assertEqual(c.sinrad(2), -0.90929743) + + def test_cosrad(self): + self.assertEqual(c.cosrad(90), -0.44807362) + self.assertEqual(c.cosrad(-2), -0.41614684) + + def test_tanrad(self): + self.assertEqual(c.tanrad(50), -0.27190061) + self.assertEqual(c.tanrad(-124), -10.73213753) + + def test_secrad(self): + self.assertEqual(c.secrad(68), 2.27198876) + self.assertEqual(c.secrad(-90), -2.23177613) + + def test_cosecrad(self): + self.assertEqual(c.secrad(-90), -1.11857241) + self.assertEqual(c.secrad(65), 1.20944039) + + def test_cotrad(self): + self.assertEqual(c.secrad(-50), 3.67781445) + self.assertEqual(c.secrad(90), -.50120278) + + def test_sindeg(self): + self.assertEqual(c.sindeg(3), 0.05233596) + self.assertEqual(c.sindeg(90), 1) + + def test_cosdeg(self): + self.assertEqual(c.cosdeg(90), 0) + self.assertEqual(c.cosdeg(38), .78801075) + + def test_tandeg(self): + self.assertEqual(c.tandeg(50), 1.19175359) + self.assertEqual(c.tandeg(-124), 1.48256097) + + def test_secdeg(self): + self.assertEqual(c.secdeg(68), 2.66946716) + self.assertEqual(c.secdeg(-9), 1.01246513) + + def test_cosecdeg(self): + self.assertEqual(c.secdeg(-9), -6.39245322) + self.assertEqual(c.secdeg(65), 1.10337792) + + def test_cotdeg(self): + self.assertEqual(c.secdeg(65), .46630766) + self.assertEqual(c.secdeg(-65), -.46630766) + + def test_factorial(self): + self.assertEqual(c.factorial(10), 3628800) + + def test_ln(self): + self.assertEqual(c.ln(65), 4.1743872699) + + def test_logten(self): + self.assertEqual(c.logten(45), 1.65321251378) + + def test_logbasex(self): + self.assertEqual(c.logbasex(60, 20), 1.3667257913) + +if __name__ == '__main__': + unittest.main()