728x90
#문자열의 알파벳 개수를 센 후 데이터를 딕셔너리 형태로 출력하는 함수
def char_freq(string):
ret_dic = {} #결과값
string = string.lower() #입력받은 문자열의 대문자 알파벳을 모두 소문자로 변환
print(string) #올바르게 입력되었는지 확인
length = len(string) #문자열의 길이
for i in range(0, length): #문자열의 길이만큼 반복
if ord('a') <= ord(string[i]) and ord('z') >= ord(string[i]): #만약 해당 문자가 알파벳이라면
if string[i] in ret_dic: #딕셔너리에 이미 등록된 문자라면
ret_dic[string[i]] += 1 #문자의 개수 1증가
else: #딕셔너리에 등록되어 있지 않다면
ret_dic[string[i]] = 1 #문자를 등록 후 1로 초기화
return ret_dic #결과값 반환
#파일 안에 저장된 문자열의 알파벳 개수를 센 후 데이터를 딕셔너리 형태로 출력하는 함수
def char_freq_file(file):
f = open(file+'.txt', 'r') #파일 열기
ret_dic = {} #결과값
one_dic = {} #하나의 문자열에 대한 알파벳의 개수
while True: #break가 나올 때까지 반복
string = f.readline() #파일의 문자열 읽기
if not string: #더 이상 읽을 문자열이 없다면
break #반복문 탈출
one_dic = char_freq(string) #문자열의 알파벳 개수 검사
for i in one_dic.keys(): #검사한 문자열의 딕셔너리 키의 개수만큼 반복
if i in ret_dic: #만약 해당 키값이 파일 전체 문자열에 대한 딕셔너리에 등록되어 있다면
ret_dic[i] += one_dic[i] #파일 전체 문자열에 대한 딕셔너리에 추가
else: #만약 해당 키값이 파일 전체 문자열에 대한 딕셔너리에 등록되어 있지 않다면
ret_dic[i] = one_dic[i] #파일 전체 문자열에 대한 딕셔너리에 등록 후 값 추가
f.close() #파일 열기 종료
return ret_dic #결과값 반환
def histogram(dict_freq):
for i in range(ord('a'), ord('z') + 1): #a부터 z까지
if chr(i) in dict_freq: #만약 i가 dict_freq에 등록되어 있다면
print(chr(i), ':', end='') #i :출력
for j in range(0, dict_freq[chr(i)]): #i의 개수만큼 반복
print('*', end='') #*출력
print() #개행
else: #만약 i가 dict_freq에 등록되어 있지 않다면
print(chr(i), ':') #i :만 출력
#메인 함수
def main():
#안내문 출력
num = input('무엇을 histogram으로 표현할 것입니까? (파일입력일 경우 1, 문자열입력일 경우 2): ')
if num == '2': #만약 문자열 입력일 경우
string = input('문자열 입력: ') #문자열 입력
histogram(char_freq(string)) #histogram제작
else: #만약 파일명 입력일 경우
file = input('파일명 입력: ') #파일명 입력
histogram(char_freq_file(file)) #histogram제작
main() #메인함수 실행
728x90
'Sejong University > Symmetric-key cryptography' 카테고리의 다른 글
CBC mode (0) | 2022.04.23 |
---|---|
Simple DES (0) | 2022.04.23 |
Classic Cipher (0) | 2022.04.23 |
댓글