언어 자료구조 알고리즘/프로그래밍 실습

[C#] 컬렉션(Dictionary) 실습 - 도서 관리 프로그램

언제나휴일 2019. 8. 10. 15:41
반응형

실습) 다음 시나리에 맞게 프로그램을 작성하시오.

도서 관리 프로그램은 콘솔 응용 프로그램이다.
도서 관리 프로그램은 응용, 도서 관리자, 도서, 프로그래밍 도서 형식으로 구성한다.
응용에서는 사용자와 상호작용을 담당한다.
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
메뉴에는 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
도서 추가를 선택하면 도서 유형을 선택하고 도서 정보를 입력받아 도서 관리자에게 추가 요청한다.
도서는 ISBN(주요키, 10자리), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다.
프로그래밍 도서는 개발 언어도 입력받는다.
도서 삭제 기능에서는 삭제할 회원의 ISBN을 사용자로부터 입력받아 도서 관리자에게 삭제요청한다.
도서 검색 기능에서는 검색할 도서의 ISBN을 사용자로부터 입력받아 도서 관리자에게 검색 요청한다.
전체 보기에서는 foreach 문을 이용하여 전체 도서 정보를 출력한다.
도서 관리자는 IEnumerable 인터페이스를 구현 약속한다.
도서정보를 출력할 때는 ISBN, 도서명, 저자, 출판사, 가격 정보를 입력받는다.
프로그래밍 도서일 때는 개발 언어도 출력한다.

*2019년 공주대에서

BT.cs

namespace 도서_관리_프로그램
{
    /// <summary>
    /// 도서 유형 열거형 
    /// </summary>
    public enum BT
    {
        /// <summary>
        /// 일반 도서
        /// </summary>
        NORMAL,
        /// <summary>
        /// 프로그래밍 도서
        /// </summary>
        SPECIAL
    }
}

Book.cs

namespace 도서_관리_프로그램
{
    /// <summary>
    /// 도서 클래스
    /// </summary>
    public class Book
    {   
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <param name="title">도서제목</param>
        /// <param name="publisher">출판사</param>
        /// <param name="price">가격</param>
        /// <param name="author">저자</param>
        public Book(string isbn, string title, string publisher, int price,string author)
        {
            ISBN = isbn;
            Title = title;
            Publisher = publisher;
            Price = price;
            Author = author;
        }
        /// <summary>
        /// ISBN 속성 - 가져오기
        /// </summary>
        public string ISBN { get; private set; }
        /// <summary>
        /// 제목 속성 - 가져오기
        /// </summary>
        public string Title { get; private set; }
        /// <summary>
        /// 출판사 속성 - 가져오기
        /// </summary>
        public string Publisher { get; private set; }
        /// <summary>
        /// 저자 속성 - 가져오기
        /// </summary>
        public string Author { get; private set; }
        /// <summary>
        /// 가격 속성 - 가져오기
        /// </summary>
        public int Price { get; private set; }
    }
}

ProgrammingBook.cs

namespace 도서_관리_프로그램
{
    /// <summary>
    /// 프로그래밍 도서 클래스 - Book 클래스에서 파생
    /// </summary>
    public class ProgrammingBook : Book
    {

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <param name="title">제목</param>
        /// <param name="publisher">출판사</param>
        /// <param name="price">가격</param>
        /// <param name="author">저자</param>
        /// <param name="dev_lan">개발 언어</param>
        public ProgrammingBook(string isbn, string title, string publisher, int price, string author,string dev_lan):base(isbn,title,publisher,price,author)
        {
            DevLan = dev_lan;
        }

        /// <summary>
        /// 개발 언어 속성 - 가져오기
        /// </summary>
        public string DevLan { get; private set; }
    }
}

BookManager.cs

using System;
using System.Collections;
using System.Collections.Generic;

namespace 도서_관리_프로그램
{
    /// <summary>
    /// 도서 관리자 클래스
    /// </summary>
    public class BookManager:IEnumerable
    {
        Dictionary<string, Book> bdic = new Dictionary<string, Book>();
        /// <summary>
        /// 도서 추가 메서드
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <param name="title">제목</param>
        /// <param name="publisher">출판사</param>
        /// <param name="price">가격</param>
        /// <param name="author">저자</param>
        /// <param name="dev_lan">개발 언어</param>
        public void AddBook(string isbn, string title, string publisher, int price, string author,string dev_lan)
        {            
            bdic[isbn] = new ProgrammingBook(isbn, title, publisher, price, author, dev_lan);
        }

        /// <summary>
        /// 도서 추가 메서드
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <param name="title">제목</param>
        /// <param name="publisher">출판사</param>
        /// <param name="price">가격</param>
        /// <param name="author">저자</param>
        public void AddBook(string isbn, string title, string publisher, int price,string author)
        {
            bdic[isbn] = new Book(isbn, title, publisher, price, author);
        }

        /// <summary>
        /// 도서 삭제 메서드
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <returns>삭제 성공 여부</returns>
        public bool RemoveBook(string isbn)
        {
            if(bdic.ContainsKey(isbn))
            {
                bdic.Remove(isbn);
                return true;
            }
            return false;
        }
        
        /// <summary>
        /// 도서 검색 메서드
        /// </summary>
        /// <param name="isbn">isbn</param>
        /// <returns>도서 개체</returns>
        public Book FindBook(string isbn)
        {
            if(bdic.ContainsKey(isbn))
            {
                return bdic[isbn];
            }            
            return null;
        }

        /// <summary>
        /// IEnumerable 인터페이스에 약속한 메서드 구현
        /// </summary>
        /// <returns>IEnumerator</returns>
        public IEnumerator GetEnumerator()
        {
            return bdic.Values.GetEnumerator();
        }
    }
}

MyApp.cs

using System;

namespace 도서_관리_프로그램
{   
    /*도서 관리 프로그램은 응용, 도서 관리자, 도서, 프로그래밍 도서 형식으로 구성한다.*/    
    class MyApp
    {
        BookManager bm = new BookManager();
        internal void Run()//사용자와 상호작용
        {
            //응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
            ConsoleKey key = ConsoleKey.NoName;
            while ((key = SelectMenu()) != ConsoleKey.Escape)
            {
                switch (key)
                {
                    case ConsoleKey.F1: Add(); break;
                    case ConsoleKey.F2: Remove(); break;
                    case ConsoleKey.F3: Search(); break;
                    case ConsoleKey.F4: ViewAll(); break;
                    default: Console.WriteLine("잘못 선택하였습니다."); break;
                }
                Console.WriteLine("아무 키나 누르세요.");
                Console.ReadKey(true);
            }
        }

        private void ViewAll()
        {
            //전체 보기에서는 foreach 문을 이용하여 전체 도서 정보를 출력한다.
            foreach(Book book in bm)
            {
                ViewBook(book);
            }
        }

        private void Search()
        {
            //도서 검색 기능에서는 검색할 도서의 ISBN을 사용자로부터 입력받아 도서 관리자에게 검색 요청한다.
            
            Console.Write("검색할 도서의 ISBN:");
            string isbn = Console.ReadLine();
            Book book = bm.FindBook(isbn);
            if (book != null)
            {
                ViewBook(book);
            }
            else
            {
                Console.WriteLine("도서 정보를 찾지 못했습니다.");
            }
        }

        private void ViewBook(Book book)
        {
            Console.WriteLine("=== {0} , {1} ", book.ISBN, book.Title);
            Console.WriteLine("   출판사:{0} 저자:{1} 가격:{2}", book.Publisher, book.Author, book.Price);
            ProgrammingBook pb = book as ProgrammingBook;
            if(pb != null)
            {
                Console.WriteLine("  개발 언어:{0}", pb.DevLan);
            }
        }

        private void Remove()
        {
            //도서 삭제 기능에서는 삭제할 회원의 ISBN을 사용자로부터 입력받아 도서 관리자에게 삭제요청한다.            
            Console.Write("삭제할 도서의 ISBN:");
            string isbn = Console.ReadLine();
            if(bm.RemoveBook(isbn))
            {
                Console.WriteLine("삭제하였습니다.");
            }
            else
            {
                Console.WriteLine("삭제 실패하였습니다.");
            }
        }

        private void Add()
        {
            //도서 추가를 선택하면 도서 유형을 선택하고             
            BT bt = ChoiceBookType();
            //도서는 ISBN(주요키, 10자리), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다.
            Console.Write("ISBN(10자리):");
            string isbn = Console.ReadLine();
            Console.Write("도서명:");
            string title = Console.ReadLine();
            Console.Write("출판사:");
            string publisher = Console.ReadLine();
            Console.Write("가격:");
            int price = 0;
            int.TryParse(Console.ReadLine(), out price);
            Console.Write("저자:");
            string author = Console.ReadLine();

            if (bt != BT.NORMAL)
            {
                Console.Write("개발 언어:");
                string dev_lan = Console.ReadLine();
                bm.AddBook(isbn,title,publisher,price,author,dev_lan); //도서 관리자에게 추가 요청한다.
            }
            else
            {
                //도서 관리자에게 추가 요청한다.
                bm.AddBook(isbn,title,publisher,price,author);
            }
            Console.WriteLine("추가");
        }

        private BT ChoiceBookType()
        {
            Console.WriteLine("도서 유형을 선택하세요.(1:일반(디폴트), 2:프로그래밍 도서)");
            Console.Write("유형:");
            string bt = Console.ReadLine();
            if (bt == "2")
            {
                return BT.SPECIAL;
            }
            return BT.NORMAL;
        }

        private ConsoleKey SelectMenu()
        {
            //메뉴에는 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
            Console.Clear();
            Console.WriteLine("=== 메인 메뉴 ===");
            Console.WriteLine("F1: 추가");
            Console.WriteLine("F2: 삭제");
            Console.WriteLine("F3: 검색");
            Console.WriteLine("F4: 전체 보기");
            Console.WriteLine("ESC: 종료");
            return Console.ReadKey(true).Key;
        }
    }
}

Program.cs

namespace 도서_관리_프로그램
{
    class Program
    {
        static void Main(string[] args)
        {
            MyApp app = new MyApp();
            app.Run();
        }
    }
}

 

반응형