언유상씨의 건전한 취미생활

Python으로 글자수 세기 프로그램 제작하기 본문

건전한 학습생활 - python

Python으로 글자수 세기 프로그램 제작하기

언유상 2019. 6. 2. 13:58

때로 글을 쓰고 글자수를 세야하는 경우가 있는데, 인터넷 상황이 좋지 않아도 글자수를 셀 수 있는 프로그램을 만들어 보고 싶어서 제작했다. 코드 완성은 꽤나 오래전에 되었지만, 어찌저찌 하다보니 벌써 6월달이 되어있다...

 

역시 이번 프로그램도 부족한 부분들이 있지만, 고쳐나가겠다.

 

1. 전체 코드

while True:
    print('글자수 세기 프로그램(ver.1.0.0)')
    Mode = input('모드를 선택하십시오.\n 1. 공백 제외 / 2. 공백 포함 / 3. 단어 개수 / 4. 종료 ')
    if (Mode ==  '1'):
        while True:
            print ('문장을 붙여 넣기 해 주시고, 엔터를 2번 눌러주세요!')
            count = 0
            time = 0
            final = 0
            blank_chk = 0
            list_1 = []
            list_2 = []
            list_3 = []

            while True:
                time = time + 1
                text = input('')
                list_text = list (text)
                list_1 = list_text + list_1
                list_2 = list_2 + list_1
                list_1 = []
                                
                length_d = len (list_2)
                if (list_2 == list_3):
                    count = count + 1
                                                
                    if (count == 1):
                        for i in range (0, length_d , 1):                  
                            if (list_2[i] == ' '):
                                blank_chk = blank_chk + 1  
                        final = length_d - blank_chk
                        print ('총 글자수는 %d자 입니다.(공백 제외)' % final)
                        break

                list_3 =  list_2
                
    elif (Mode == '2') :
        while True:
            print ('문장을 붙여 넣기 해 주시고, 엔터를 2번 눌러주세요!')
            count = 0
            time = 0
            final = 0
            list_1 = []
            list_2 = []
            list_3 = []

            while True:
                time = time + 1
                text = input('')
                list_text = list (text)
                list_1 = list_text + list_1
                list_2 = list_2 + list_1
                list_1 = []
                
                length_d = len (list_2)
                if (list_2 == list_3):
                    count = count + 1
                    
                    
                    if (count == 1):
                        final = length_d + time - 2            
                        print ('총 글자수는 %d자 입니다.(공백 포함)' % final)
                        break
                list_3 =  list_2 

        
        
    elif (Mode == '3'):
       while True:
            print ('문장을 붙여 넣기 해 주시고, 엔터를 2번 눌러주세요!')
            count = 0
            time = 0
            final = 0
            list_1 = []
            list_2 = []
            list_3 = []

            while True:
                time = time + 1
                text = input('')
                text_voca = text.split()
                list_1 = text_voca + list_1
                list_2 = list_2 + list_1
                list_1 = []
                
                length_d = len (list_2)
                if (list_2 == list_3):
                    count = count + 1
                    
                    
                    if (count == 1):
                        final = length_d             
                        print ('총 단어수는 %d자 입니다.' % final)
                        break
                list_3 =  list_2 

    elif (Mode == '4'):
        print ('프로그램이 종료됩니다.')
        quit()

    elif (Mode == '1128'):
        print ("""
                   ________________________
                   | 글자수 세기 프로그램 |
                   |                      |
                   |  제작자 : 핫빠       |               
                   |  출시일 : 2019.05.06 |
                   |  ver. 1.0.0          |        
                   |  테스터 :            |
                   |______________________|
                                           """)
    else :
        print ('잘못된 명령입니다.')

2. 사용된 문법

 

print ()

if - elif - else 

for 

while 

break

리스트 []

.split

list()

len()

 

3. 프로그램을 짜면서 고민했던 부분들

어떤 기능들이 들어가야 하는가?

우리가 보통 글자수를 셀 때 필요한 기능은 글자수 세기(공백 포함, 공백 미포함), 단어수 세기 정도인 것 같아서 그 기능들을 중점으로 코드를 제작했다.

 

처음에 들어가면 3가지 중 한가지 모드를 선택해서 들어갈 수 있다.

 

문단처리는 어떻게 할 것인가?

글을 쓰다보면 가독성을 위해서, 혹은 주제가 바뀌는 것을 알기 쉽게 다음 문단으로 넘어가 이야기를 시작하게 된다.

메모장이나 다른 어딘가에 있는 글을 복사해서 올때, 파이썬은 엔터키 역시 하나의 문자로 받아 들이게 되고, 엔터 이전 부분의 글자수만 세게 된다.

사진처럼 엔터키를 입력받으면 바로 결과를 출력하게 되며, 보기에 좋지 않다.

따라서 엔터키의 입력이 두번 되었을때 결과를 출력하는 방법을 택해야 했고, 그 방법은 다음 부분을 통해 해결할 수 있었다.

 

 list_1 = text_voca + list_1 
                list_2 = list_2 + list_1 
                list_1 = [] 
                 
                length_d = len (list_2) 
                if (list_2 == list_3): 
                    count = count + 1 

.

.

.

                 list_3 =  list_2  

입력받은 값을 빈 리스트(list_3)에 저장시키고, 입력받은 값(list_2)와 같다면 count라는 변수의 값을 1증가시키게 된다.(엔터키가 눌리게 되면 파이썬이 입력받은 값을 처리하기 때문에 list_2 와 list_3의 내용물은 같아지게 된다.)

count는 초기값이 0 이고, 한 바퀴가 돌때마다 0으로 초기화 시키기 때문에 count의 값이 1일때 글자수를 출력하면 된다.

엔터키를 두번 눌렀을 때 글자수를 세게 된다. 마지막 문장과 출력값 사이에 한줄이 띄어져 있다는 걸 보면 알 수 있다.

 

4. 구현하고 싶은 기능들

모드 선택으로 돌아가기

사용자의 편의를 위한 부분들 중 하나이다.

원래대로라면 본인이 필요한 항목 (공백의 포함 여부, 단어수) 하나만 골라서 쓰면 될 것 같기에 큰 문제가 없을것으로 보였지만, 만약에 잘못 눌렀을 경우에는..? (솔직히 끄고 다시 켜는게 빠르기는 하다.) 

특정 문자를 입력했을 경우에 모드 선택으로 돌아오게 하고 싶었지만, 글자수를 세려는 문장에 그 문자가 들어가 있지 않는다는 보장이 없으므로 구현하는데는 실패했다. 또한 특정 문자를 너무 길게하는 방안도 있었지만, 차라리 끄고 켜는게 빠를 수도 있다는 생각에 생각을 접었다.

사용자가 끄고 프로그램을 다시 작동시키는 시간보다 짧으면서, 글자수를 세려는 글과 충돌하지 않는 문자를 이용해 모드 선택으로 되돌아가는 방안을 모색해야 할 것 같다.

아까와 같은 사진이다. 잘 보면 탈출이 불가하다는 것을 알 수 있다. (모드 선택으로 돌아가지 못함.)

아무것도 입력하지 않았을 때의 출력값

이 문제도 평소에는 문제가 되지 않을 것 같아서 뒷전으로 미뤄두었지만(아무것도 입력하지 않았는데 글자수를 셀 일이 없을테니까), 프로그램의 완성도를 높이기 위해서는 꼭 해결해야 할 문제인것 같다.

공백을 포함시키면서 횟수와 글자의 개수를 연산시키는데, 이때 발생하는 문제인것 같다.

각 모드에서 아무것도 입력하지 않았을 때의 출력값. 공백을 포함하는 경우 아무것도 입력하지 않았을 때 -1이 출력되는 것을 볼 수 있다. 

byte 값 출력

포털사이트 등에서 제공하는 글자수 세기 프로그램들은 byte 값 또한 동시에 출력해주는데, 이 부분도 구현해보고 싶다. 

이런식으로 byte의 값도 알려준다.


5. 마치며

정말 필요에 의해 만든것이기 때문에, 간결하면서도 결과값을 정확하게 내는 부분에만 치중했다.

반대로 말하면 사용자의 편의나 프로그램 자체의 완성도 측면에서는 떨어지는 부분들이 있는 것 같다.

다음에는 조금 더 효율적으로 작동할 수 있도록 신경을 써야 할 것 같다.

 

아래는 사람들이 자주 사용하는 글자수 세기 프로그램과 비교하는 부분이다.

 

모 포털사이트에서 제공하는 글자수 세기. 프로그램과 같은 값을 출력하는 것을 알 수 있다.
모 사이트에서 제공하는 영어 단어수 세기. 출력값이 같다는 것을 알 수 있다.

실행 중 발생하는 오류, 코드의 효율성이 떨어지는 문제점, 논리적인 결함과 같이 프로그램에 관련된 문제를 발견하시면 댓글 부탁드립니다!

Comments