calc_functions.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 파이썬 계산기의 함수 모듈: 다음 단계
 
# 팩토리얼 함수:
def factorial(n):
    try:
        n = int(n)
    except:
        return "--> 오류!"
 
    # '0'과 같은지 체크(특별한 경우):
    if n == 0:
        return 1
 
    # 매우 큰 수인지 확인해서 돌려보냄:
    if n > 40:
        return "--> 답이 화면을 가득 채울 수 있습니다!"
    
    # 음수에 발생한 경우에 대한 점검:
    if n < 0:
        return "--> 오류!"
    
    # 팩토리얼 알고리즘 적용:
    ans = n
    while n > 1:
        ans = ans*(n-1)
        n = n-1
        return ans
 
 
 
# 로마 숫자로 변환하는 함수01:
def to_roman(n):
    try:
        n = int(n)
    except:
        return "--> 오류!"
 
    # 인수가 4999보다 큰 숫자인지 범위를 벗어난 것으로 판단합니다.:
    if n > 4999:
        return "--> 범위를 넘어섭니다."
 
    # 튜플 안에 튜플  생성:
    romans = ((1000,"M"), (900,"CM"), (500,"D"), (400,"CD"), (100,"C"), (90,"XC"), (50,"L"),
               (40,"XL"), (10,"X"), (9,"IX"), (5,"V"), (4,"IV"), (1,"I"))
 
    # 알고리즘 시작:
    result =""
    for (value,letters) in romans:
        while n >= value:
            result = result + letters
            n = n - value        
    return result
 
 
 
 
# 로마 숫자로 변환하는 함수02:
def to_roman02(n):
    try:
        n = int(n)
    except:
        return "--> 오류!"
 
    # 인수가 4999보다 큰 숫자인지 범위를 벗어난 것으로 판단합니다.:
    if n > 4999:
        return "--> 범위를 넘어섭니다."
    
    # 튜플과 사전 생성:
    numberBreaks = (1000,900,500,400,100,90,50,40,10,9,5,4,1)
    letters = {1000:"M"900:"CM"500:"D"400:"CD"100:"C"90:"XC"50:"L",
               40:"XL"10:"X"9:"IX"5:"V"4:"IV"1:"I"}
 
    # 알고리즘 시작:    
    result =""
    for value in numberBreaks:
        while n >= value:
            result = result + letters[value]
            n = n - value        
    return result
 
 
 
 
# 10진수를 2진수로 변환하는 함수:
def to_binary(n):
    try:
        n = int(n)
        return bin(n)[2:]
    except:
        return "-->오류!"
 
 
 
 
# 2진수를 10진수로 변환하는 함수:
def from_binary(n):
    try:
        return int(n,2)
    except:
        return "-->오류!"
 
cs


Main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# Main.py
 
from tkinter import *
from decimal import *
import calc_functions
 
# 키 입력 함수:
def click(key):
    # = 버튼이 눌렸을 때 계산 수행:
    if key == "=":
       try:
            result = str(eval(display.get()))[0:10]
            display.insert(END, "=" + result)
       except:
            display.insert(END, "--> 오류!")
 
    # C 버튼이 눌렸을 때 display 엔트리 위젯 내용 비움:
    elif key == "C":
        display.delete(0, END)
 
    # 상수 버튼에 대한 연결 코드:
    elif key == constants_list[0]:
        display.insert(END, "3.141592654")
    elif key == constants_list[1]:
        display.insert(END, "300000000")
    elif key == constants_list[2]:
        display.insert(END, "330")
    elif key == constants_list[3]:
        display.insert(END, "149597887.5")
 
    # 함수 버튼 행동 정의:
    elif key == functions_list[0]:
        n = display.get() # display 엔트리 위젯 내용 수집
        display.delete(0,END) # display 엔트리 위젯 내용 비움
        display.insert(END, calc_functions.factorial(n))
    elif key == functions_list[1]:
        n = display.get() # display 엔트리 위젯 내용 수집
        display.delete(0,END) # display 엔트리 위젯 내용 비움
        display.insert(END, calc_functions.to_roman(n))
    elif key == functions_list[2]:
        n = display.get() # display 엔트리 위젯 내용 수집
        display.delete(0,END) # display 엔트리 위젯 내용 비움
        display.insert(END, calc_functions.to_binary(n))
    elif key == functions_list[3]:
        n = display.get() # display 엔트리 위젯 내용 수집
        display.delete(0,END) # display 엔트리 위젯 내용 비움
        display.insert(END, calc_functions.from_binary(n))
        
        
    # 그 외 다른 키를 눌렀을 때 실행될 기본 동작:
    else:
        display.insert(END, key)
 
 
 
##### 메인:
window = Tk()
window.title("Mycalcultor")
 
# top_row 프레임 생성
top_row = Frame(window)
top_row.grid(row=0, column=0, columnspan=2,sticky=N)
 
# 내용 수정이 가능한 엔트리 위젯을 사용해 결과 디스플레이 사용
display = Entry(top_row, width=45, bg="light gray")
display.grid()
 
# 숫자 버튼 생성
num_pad = Frame(window)
num_pad.grid(row=1, column=0, sticky=W)
 
# 숫자 버튼에 제공될 숫자
num_pad_list = [
'7','8','9',
'4','5','6',
'1','2','3',
'0','.','=']
 
# 반복문으로 숫자 버튼 생성
= 0 # 행 카운터
= 0 # 열 카운터
 
for btn_text in num_pad_list:
    def cmd(x=btn_text):
        click(x)
 
    Button(num_pad, text=btn_text, width=7, command=cmd).grid(row=r, column=c)
    c = c+1
    if c > 2:
        c = 0
        r = r + 1
 
# 연산자 프레임 생성
operator = Frame(window)
operator.grid(row=1, column=1, sticky=E)
 
operator_list = [
'*''/',
'+','-',
'(',')',
'C']
 
# 반복문 안에서 연산자 버튼 생성
for btn_text in operator_list:
    def cmd(x=btn_text):
        click(x)
 
    Button(operator, text=btn_text, width=5, command=cmd).grid(row=r, column=c)
    c = c+1
    if c > 1:
        c = 0
        r = r + 1
 
# 상수 프레임 생성
constants = Frame(window)
constants.grid(row=3, column=0, sticky=W)
 
constants_list = [
    'pi',
    '빛의 이동 속도(m/s)',
    '소리의 이동 속도(m/s)',
    '태양과의 평균 거리(km)']
 
# 반복문과 함께 상수 버튼 생성
= 0
= 0
 
for btn_text in constants_list:
    def cmd(x=btn_text):
        click(x)
    Button(constants, text=btn_text, width=24, command=cmd).grid(row=r, column=c)
    r = r+1
 
 
# 함수 프레임 생성
functions = Frame(window)
functions.grid(row=3, column=1, sticky=E)
 
functions_list = [
    'factorial (!)',
    '-> roman',
    '-> binary',
    'binary -> 10']
 
# 반복문과 함께 함수 버튼 생성
= 0
= 0
 
for btn_text in functions_list:
    def cmd(x=btn_text):
        click(x)
    Button(functions, text=btn_text, width=24, command=cmd).grid(row=r, column=c)
    r = r+1
 
 
 
 
 
 
 
###### 메인 반복문 실행
window.mainloop()
 
 
 
cs


+ Recent posts