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

[C# 실습] 반도체 장비 관리 프로그램 - 3. 상세 구현

언제나휴일 2020. 9. 22. 11:54
반응형

[C# 실습] 반도체 장비 관리 프로그램

[C# 실습] 반도체 장비 관리 프로그램 - 1. 단일체 패턴 표현

[C# 실습] 반도체 장비 관리 프로그램 - 2. 프로토 타이핑

 

Equipment.cs

using System;

namespace 반도체_월드
{
    internal class Equipment
    {
        string name;//장비명
        readonly int seqno;//일련번호
        int mcnt;//재료개수
        int mpcnt;//생산개수
        int pcnt;//테스트 완료 제품 개수
        int scnt;//판매 개수
        static int last_seqno;//가장 최근에 부여한 일련번호

        internal int SeqNo
        {
            get
            {
                return seqno;
            }
        }

        internal int MCnt
        {
            get
            {
                return mcnt;
            }
        }
        internal int MPCnt
        {
            get
            {
                return mpcnt;
            }
        }
        internal int PCnt
        {
            get
            {
                return pcnt;
            }
        }
        internal int SCnt
        {
            get
            {
                return scnt;
            }
        }

        internal Equipment(string name)
        {
            this.name = name;
            last_seqno++;
            seqno = last_seqno;
        }
        public override string ToString()
        {
            return string.Format("{0}:{1}", seqno, name);
        }

        internal void Buy(int mcnt)
        {
            this.mcnt += mcnt;
        }

        internal int Making(int mpcnt)
        {
            if (mpcnt > mcnt)
            {
                mpcnt = mcnt;
            }
            this.mpcnt += mpcnt;
            mcnt -= mpcnt;
            return mpcnt;
        }

        internal int Testing(int pcnt)
        {
            if (pcnt > mpcnt)
            {
                pcnt = mpcnt;
            }
            this.pcnt += pcnt;
            mpcnt -= pcnt;
            return pcnt;
        }
        internal int Sale(int scnt)
        {
            if (scnt > pcnt)
            {
                scnt = pcnt;
            }
            this.scnt += scnt;
            pcnt -= scnt;
            return scnt;
        }
    }
}

EWorld.cs

using System;
using System.Collections.Generic;

namespace 반도체_월드
{
    class EWorld
    {
        #region 단일체 패턴
        //1. 생성자의 보호 수준을 private로 지정
        //멤버의 디폴트 가시성은 private
        EWorld()
        {
            Console.WriteLine("EWorld 생성자");
        }
        //2. 정적 멤버로 단일체를 참조할 변수 선언
        static EWorld eworld = null;
        //3.정적 생성자에서 단일체 생성
        static EWorld()
        {
            Console.WriteLine("정적 EWorld 생성자");
            eworld = new EWorld();
        }
        //4.다른 곳에서 단일체에 접근할 수 있게 속성 제공
        static internal EWorld EW
        {
            get
            {
                return eworld;
            }
        }
        #endregion
        Dictionary<int, Equipment> edic = new Dictionary<int, Equipment>();
        internal void Run()
        {
            ConsoleKey key = ConsoleKey.NoName;
            while((key = SelectMenu())!=ConsoleKey.Escape)
            {
                switch(key)
                {
                    case ConsoleKey.F1: Making(); break;
                    case ConsoleKey.F2: Control(); break;
                    case ConsoleKey.F3: ViewAll(); break;
                    default: Console.WriteLine("잘못 선택하였습니다."); break;
                }
                Console.WriteLine("아무 키나 누르세요.");
                Console.ReadKey(true);
            }
            
        }

        private void ViewAll()
        {
            Console.WriteLine(" F3: 전체 보기");
            foreach(Equipment equipment in edic.Values)
            {                
                Console.WriteLine("=== {0}",equipment);
                //Console.WriteLine(" 재료 개수:{0}", equipment.MCnt);
                //Console.WriteLine(" 생산 개수:{0}", equipment.MPCnt);
                //Console.WriteLine(" 제품 개수:{0}", equipment.PCnt);
                //Console.WriteLine(" 판매 개수:{0}", equipment.SCnt);
            }
        }

        private void Control()
        {
            Console.Clear();
            Console.WriteLine(" F2: 장비 제어");
            ViewAll();
            int seqno = 0;
            Console.Write("장비 일련 번호:");
            int.TryParse(Console.ReadLine(), out seqno);
            if(edic.ContainsKey(seqno)==false)
            {
                Console.WriteLine("존재하지 않는 일련 번호입니다.");
                return;
            }
            Equipment equipment = null;
            equipment = edic[seqno];
            ConsoleKey key = ConsoleKey.Escape;
            while((key = SelectControlMenu())!=ConsoleKey.Escape)
            {
                switch(key)
                {
                    case ConsoleKey.F1: BuyMeterial(equipment); break;
                    case ConsoleKey.F2: MakingSemiconductor(equipment);break;
                    case ConsoleKey.F3: TestSemiconductor(equipment); break;
                    case ConsoleKey.F4: SaleSemiconductor(equipment); break;
                    case ConsoleKey.F5: ViewStates(equipment); break;
                    default: Console.WriteLine("잘못 선택하였습니다."); break;
                }
                Console.WriteLine("아무 키나 누르세요.");
                Console.ReadKey(true);
            }

        }

        private void ViewStates(Equipment equipment)
        {
            Console.WriteLine("F5:현황확인");
            Console.WriteLine("=== {0}", equipment);
            Console.WriteLine(" 재료 개수:{0}", equipment.MCnt);
            Console.WriteLine(" 생산 개수:{0}", equipment.MPCnt);
            Console.WriteLine(" 제품 개수:{0}", equipment.PCnt);
            Console.WriteLine(" 판매 개수:{0}", equipment.SCnt);
        }

        private void SaleSemiconductor(Equipment equipment)
        {
            Console.WriteLine("F4:반도체판매");
            if (equipment.PCnt == 0)
            {
                Console.WriteLine("판매할 반도체가 없습니다.");
                return;
            }
            int scnt = 0;
            Console.Write("판매할 수량(1~{0}):", equipment.PCnt);
            int.TryParse(Console.ReadLine(), out scnt);
            scnt = equipment.Sale(scnt);
            Console.WriteLine("{0}개 판매하였습니다.",scnt);
        }

        private void TestSemiconductor(Equipment equipment)
        {
            Console.WriteLine("F3:반도체테스트");
            if (equipment.MPCnt == 0)
            {
                Console.WriteLine("테스트할 반도체가 없습니다.");
                return;
            }
            int pcnt = 0;
            Console.Write("테스트할 수량(1~{0}):", equipment.MPCnt);
            int.TryParse(Console.ReadLine(), out pcnt);
            pcnt = equipment.Testing(pcnt);
            Console.WriteLine("{0}개 테스트 하였습니다.",pcnt);
        }

        private void MakingSemiconductor(Equipment equipment)
        {
            Console.WriteLine("F2:반도체생산");
            if(equipment.MCnt==0)
            {
                Console.WriteLine("생산할 재료가 없습니다.");
                return;
            }
            int pmcnt = 0;
            Console.Write("생산할 수량(1~{0}):",equipment.MCnt);
            int.TryParse(Console.ReadLine(), out pmcnt);
            pmcnt = equipment.Making(pmcnt);
            Console.WriteLine("{0}개를 생산하였습니다.",pmcnt);
        }

        private void BuyMeterial(Equipment equipment)
        {
            Console.WriteLine("F1: 재료구입");
            int mcnt = 0;
            Console.Write("구입할 수량:");
            int.TryParse(Console.ReadLine(), out mcnt);
            equipment.Buy(mcnt);
            //equipment.MCnt += mcnt; MCnt 속성에 set블럭을 정의했을 때
        }

        private ConsoleKey SelectControlMenu()
        {
            Console.Clear();
            Console.WriteLine("=== 반도체 장비 제어 메뉴 ===");
            Console.WriteLine("F1: 재료구입");
            Console.WriteLine("F2:반도체생산");
            Console.WriteLine("F3:반도체테스트");
            Console.WriteLine("F4:반도체판매");
            Console.WriteLine("F5:현황확인");
            Console.WriteLine("메뉴를 선택 (ESC:메인 메뉴로)☞");
            return Console.ReadKey(true).Key;
        }

        private void Making()
        {
            Console.WriteLine(" F1: 장비 생산");
            string name;
            Console.Write("장비 이름:");
            name = Console.ReadLine();
            Equipment equipment = new Equipment(name);
            int seqno = equipment.SeqNo;
            edic[seqno] = equipment;
        }

        private ConsoleKey SelectMenu()
        {
            Console.Clear();
            Console.WriteLine("=== 반도체 월드 메인 메뉴 ===");
            Console.WriteLine(" F1: 장비 생산");
            Console.WriteLine(" F2: 장비 제어");
            Console.WriteLine(" F3: 전체 보기");
            Console.WriteLine("메뉴를 선택 ☞");
            return Console.ReadKey(true).Key;
        }
    }
}

Program.cs

namespace 반도체_월드
{
    class Program
    {
        static void Main(string[] args)
        {
            EWorld ew = EWorld.EW;
            ew.Run();
        }
    }
}
반응형