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

[C#] 컬렉션 실습 - IList 인터페이스 구현 약속한 컬렉션

언제나휴일 2019. 8. 9. 17:26
반응형

실습) 다음 시나리오를 만족하는 프로그램을 작성하시오.

회원 관리 프로그램은 콘솔 응용 프로그램이다.
회원 관리 프로그램은 응용, 회원 관리자, 회원, 특별 회원 형식으로 구성한다.
응용에서는 사용자와 상호작용을 담당한다.
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
메뉴에는 회원 추가, 회원 삭제, 회원 검색, 전체 회원 보기, 프로그램 종료가 있다.
회원 추가를 선택하면 회원 유형을 선택하고 회원의 정보를 입력받아 회원 관리자에게 추가요청한다.
회원은 이름과 주소를 사용자로부터 입력받고 추가 순으로 회원일련번호를 부여받는다.
특별 회원은 이메일 주소도 입력받는다.
회원 삭제 기능에서는 삭제할 회원의 일련번호를 사용자로부터 입력받아 회원 관리자에게 삭제요청한다.
회원 검색 기능에서는 검색할 회원의 일련번호를 사용자로부터 입력받아 회원 관리자에게 검색 요청한다.
전체 보기에서는 회원 관리자에 보관한 전체 회원의 수를 요청한 후 인덱서를 통해 전체 회원 정보를 출력한다.
회원정보를 출력할 때는 회원일련번호, 이름, 주소를 출력한다.
특별 회원일 때는 주소도 출력한다.

*2019년 공주대에서

 

mt.cs

namespace 회원_관리_프로그램
{
    enum MT
    {
        NORMAL, SPECIAL
    }
}

 

member.cs

namespace 회원_관리_프로그램
{
    internal class Member
    {   
        public Member(string name, string addr)
        {
            Name = name;
            Addr = addr;
            lastno++;
            no = lastno;
        }

        public string Name { get; internal set; }
        public string Addr { get; internal set; }
        readonly int no;
        static int lastno;
        public int No
        {
            get
            {
                return no;
            }
        }
    }
}

SpecialMember.cs

namespace 회원_관리_프로그램
{
    internal class SpecialMember : Member
    {
        public SpecialMember(string name, string addr, string email):base(name,addr)
        {
            Email = email;
        }
        public string Email { get; internal set; }
    }
}

MemberManager.cs

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

namespace 회원_관리_프로그램
{
    internal class MemberManager
    {
        List<Member> memebers = new List<Member>();        
        public int TotalCount
        {
            get
            {
                return memebers.Count;
            }
        }
        public Member this[int index]
        {
            get
            {
                return memebers[index];
            }
        }

        internal void AddMember(string name, string addr, string email)
        {
            memebers.Add(new SpecialMember(name, addr, email));
        }

        internal void AddMember(string name, string addr)
        {
            memebers.Add(new Member(name, addr));
        }

        internal bool RemoveMember(int seq)
        {
            Member m = FindMember(seq);
            if(m != null)
            {
                memebers.Remove(m);
                return true;
            }
            return false;
        }
        internal Member FindMember(int seq)
        {
            foreach (Member m in memebers)
            {
                if (m.No == seq)
                {                    
                    return m;
                }
            }
            return null;
        }
    }
}

MyApp.cs

using System;

namespace 회원_관리_프로그램
{
    /*회원 관리 프로그램은 응용, 회원 관리자, 회원, 특별 회원 형식으로 구성한다.*/
    internal class MyApp
    {
        MemberManager mm = new MemberManager();
        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()
        {
            //전체 보기에서는 회원 관리자에 보관한 전체 회원의 수를 요청한 후 인덱서를 통해 전체 회원 정보를 출력한다.
            int total = mm.TotalCount;
            for(int i = 0; i<total; i++)
            {
                ViewMember(mm[i]);
            }
        }

        private void Search()
        {
            //회원 검색 기능에서는 검색할 회원의 일련번호를 사용자로부터 입력받아 회원 관리자에게 검색 요청한다.
            int seq = 0;
            Console.Write("검색할 회원의 일련번호:");
            string str = Console.ReadLine();
            if (int.TryParse(str, out seq))
            {
                Member member = mm.FindMember(seq);
                if(member !=null)
                {
                    ViewMember(member);
                }
                else
                {
                    Console.WriteLine("회원 정보를 찾지 못했습니다.");
                }
            }
            else
            {
                Console.WriteLine("잘못 입력하였습니다.");
            }
        }

        private void ViewMember(Member member)
        {
            Console.WriteLine("<{0}> 회원 이름:{1}, 주소:{2}",member.No, member.Name, member.Addr);
            SpecialMember sm = member as SpecialMember;
            if(sm != null)
            {
                Console.WriteLine("   이메일:{0}", sm.Email);
            }
        }

        private void Remove()
        {
            //회원 삭제 기능에서는 삭제할 회원의 일련번호를 사용자로부터 입력받아 회원 관리자에게 삭제요청한다.
            int seq = 0;
            Console.Write("삭제할 회원의 일련번호:");
            string str = Console.ReadLine();
            if(int.TryParse(str,out seq))
            {
                if(mm.RemoveMember(seq))
                {
                    Console.WriteLine("정상적으로 삭제하였습니다.");
                }
                else
                {
                    Console.WriteLine("삭제 실패하였습니다.");
                }
            }
            else
            {
                Console.WriteLine("잘못 입력하였습니다.");
            }
        }

        private void Add()
        {
            //회원 추가를 선택하면 회원 유형을 선택하고 
            MT mt = ChoiceMemberType();

            //회원의 정보를 입력받아 
            Console.Write("이름:");
            string name = Console.ReadLine();
            Console.Write("주소:");
            string addr = Console.ReadLine();
            if (mt!=MT.NORMAL)
            {
                Console.Write("이메일:");
                string email = Console.ReadLine();
                mm.AddMember(name, addr, email); //회원 관리자에게 추가요청한다.
            }
            else
            {
                //회원 관리자에게 추가요청한다.
                mm.AddMember(name, addr);
            }            
            Console.WriteLine("추가");
        }

        private MT ChoiceMemberType()
        {
            Console.WriteLine("회원 유형을 선택하세요.(1:일반(디폴트), 2:특별)");
            Console.Write("유형:");
            string mt = Console.ReadLine();
            if(mt == "2")
            {
                return MT.SPECIAL;
            }
            return MT.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();
        }
    }
}

일반 회원 추가
특별 회원 추가
전체 보기
검색
삭제

반응형