본문 바로가기

1. Python

3/17 IT 국비교육 (12일차) / 26.평가

 


문제

 

전화번호부 프로그램을 만드려고 합니다. 아래 조건을 만족하는 프로그램을 작성하세요.
1. 이름, 전화번호, 주소, 이메일, 그룹을 입력받아 저장합니다. (10점)
2. 입력받은 이름, 전화번호, 주소, 이메일, 그룹을 출력합니다. (5점)
3. 이름, 전화번호 일부, 이메일, 그룹 등으로 전화번호를 검색할 수 있습니다. (10점)
4. 전화번호를 삭제할 수 있습니다. (5점)
5. 저장된 전화번호를 파일에 저장합니다. (10점)
6. 프로그램 종료 후 재실행 할 때 저장된 전화번호를 불러옵니다. (10점)
7. 전화번호 출력시 이름순으로 오름차순 정렬합니다. (10점)
8. 중복된 전화번호는 저장할 수 없습니다. (10점)
9. 적절한 예외처리를 하여 비정상적인 프로그램 종료가 생기지 않습니다. (5점)
10. 정상 종료시까지 무한으로 메뉴를 반복합니다. (5점)
11. 각 라인에 대해 자세한 주석을 작성합니다. (10점)
12. 클래스를 이용하여 객체지향 프로그래밍으로 설계합니다. (10점)
(상대경로 이용 및 파일은 .zip으로 압축하여 첨부 요청)

 

 

 

 

제출한 답안

 

class phonebook:                                                                

# 'phonebook' 이라는 class 생성.

  def __init__(self, name, num, add, email, group):
    self.name = name                                                          # 이름
    self.num = num                                                              # 전화번호
    self.add = add                                                                # 주소
    self.email = email                                                           # 이메일
    self.group = group                                                          # 그룹
                                                                                # class를 초기화하는 __init__ 메서드 생성.

  def __str__(self):
    return f'{self.name},{self.num},{self.add},{self.email},{self.group}'      

 # print()로 호출 시 문자열 표현을 반환해주는 __str__ 메서드 생성.


  def add_data(self):
    name, num, add, email, group = input('데이터를 입력하세요.(이름,전화번호,주소,이메일,그룹 순)').split(',')
    for data in self.list:
      if data.num == num:
        print('중복된 전화번호입니다.')
        return                                                                            # 중복된 전화번호를 입력 시 반환되도록 설정.
    self.list.append(phonebook(name, num, add, email, group))
    print('입력되었습니다.')                                                    

# data를 추가하는 add_data 메서드 생성. (data : 이름(name), 전화번호(num), 주소(add), 이메일(email), 그룹(group))


  def show_data(self):
    for data in sorted(self.list, key=lambda x: x.name):
      print(data, end='\n')                                                     

# data를 출력하는 show_data 메서드 생성. 출력 시 name으로 오름차순 정렬되게 설정.


  def save_data(self):
    with open('./phonebook.txt', 'wt') as f:
      for data in self.list:
        f.write(f'{data.name},{data.num},{data.add},{data.email},{data.group}\n')
    print('저장되었습니다.')                                                   

 # data를 저장하는 save_data 메서드 생성. 상대경로를 이용 (./phonebook.txt)


  def search_data(self):
    query = input("검색할 내용을 입력하세요: ")
    for data in self.list:
        if query in data.name or query in data.num or query in data.email or query in data.group:
            print(data)                                                         

# data를 검색하는 show_data 메서드 생성.


  def del_data(self, num):
      for i, data in enumerate(self.list):
          if data.num == num:
              del self.list[i]
              print(f'{num}의 정보가 삭제되었습니다.')
              return
      print(f'{num}의 정보가 존재하지 않습니다.')                               

# data안의 전화번호(num)을 삭제하는 del_data 메서드 생성.


  def main(self):
    self.list = []
    try:
      with open('./phonebook.txt', 'rt') as f: 
        lines = f.readlines()                                                   # 파일을 1줄씩 작성 후 lines에 저장.
        for line in lines:
          data = line.strip().split(',')                                        # strip()으로 공백을 제거한 후, 반점(,)으로 data 구분
          if len(data) != 5:
            continue                                                            

# 만약 구분한 data가 5개가 아닐 경우, 다음 데이터로 넘어가도록 함.
          name, num, add, email, group = data
          if name == "조윤재":                                               # 맨 아래의 예시 data가 같이 출력되지 않도록 함.
            continue
          self.list.append(phonebook(name, num, add, email, group))
      print('전화번호를 불러왔습니다.')
    except FileNotFoundError:
      print('저장된 전화번호가 없습니다.')                           

# try-except문의 예외처리를 이용하여 파일이 존재하지 않을 때 발생하는 비정상적인 error를 방지.


    while True:
      choice = int(input('아래 번호를 선택하세요. \n1. 데이터 입력 \n2. 데이터 출력 \n3. 데이터 저장 \n4. 데이터 검색 \n5. 데이터 삭제 \n6. 프로그램 종료 \n'))
      if choice == 1:
        self.add_data()
      elif choice == 2:
        self.show_data()
      elif choice == 3:
        self.save_data()
      elif choice == 4:
        self.search_data()    
      elif choice == 5:
        num = input('삭제할 전화번호를 입력하세요: ')                           

# num을 인자로 받아 del_data 메서드를 작동할 수 있게 함.
        self.del_data(num)
      elif choice == 6:
        print('프로그램을 종료합니다.')
        break                                                                  

# while문을 통해 정상 종료 시 까지 무한으로 메뉴를 반복하며, 번호를 입력하여 원하는 내용을 출력할 수 있도록 함.
# (1.데이터 입력 2.데이터 출력 3.데이터 저장 4.데이터 검색 5.데이터 삭제 6.프로그램 종료)


n = phonebook('조윤재', '010-0000-0000', '서울 용산구', 'aaaa@naver.com', 'k-dt')
n.main()                                                                        

# 생성한 phonebook이라는 class를 이용하여 main 메서드로 프로그램 실행.

 

 

조윤재_시험_0317.ipynb
0.01MB