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

[C# 실습, 예광탄 소스] 레코드 코팅

언제나휴일 2020. 10. 6. 10:02
반응형

시나리오 바로가기 

예광탄

프로그램 유형: 콘솔 응용 프로그램

 

RCMachine.cs

using System;
using System.Threading;

namespace 콘솔_예광탄
{
    public class RCMachine
    {
        public event CotingEventHandler OnCoting;
        int rarea;
        /// <summary>
        /// 레코드 단위 면적
        /// </summary>
        public int RArea
        {
            get
            {
                return rarea;
            }
            set
            {
                Random rand = new Random();
                rarea = value;
                cmaxavailcnt = rand.Next(200) + 900;
            }
        }
        /// <summary>
        /// 투입구 반경
        /// </summary>
        public int CRadius
        {
            get;
            set;
        }
        /// <summary>
        /// 회전 속도
        /// </summary>
        public int SpinSpeed
        {
            get;
            set;
        }

        /// <summary>
        /// 원판 레코드 개수
        /// </summary>
        public int SourceCnt
        {
            get;
            set;
        }
        /// <summary>
        /// 코팅액 개수(단위:병)
        /// </summary>
        public int CoatingLiq
        {
            get;
            set;
        }
        /// <summary>
        /// 코팅한 레코드 개수
        /// </summary>
        public int ProductCnt
        {
            get;
            set;
        }
        int cavailcnt;//현재 코팅액으로 코팅할 수 있는 레코드 수
        int cmaxavailcnt;//한 병의 코팅액으로 코팅할 수 있는 레코드 수
        public int MAXACNT
        {
            get
            {
                return cmaxavailcnt;
            }
        }
        int tobearea;//코팅해야 할 면적
        /// <summary>
        /// 가동중인지 여부
        /// </summary>
        public bool IsStart
        {
            get;
            set;
        }
        Timer timer;
        public void Start()
        {
            //이미 가동중 일 때
            if(IsStart)
            {
                return;
            }
            //원판 레코드가 없거나
            //코딩액이 하나의 원판을 코팅할 수 없을 때 
            if(((SourceCnt==0)&&(tobearea==0))|| ((CoatingLiq == 0) && (cavailcnt < RArea)))
            {
                IsStart = false;
                if (OnCoting != null)
                {
                    OnCoting(this, new CotingEventArgs(
                        ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
                }
                return;
            }
            if ((CoatingLiq != 0) && (cavailcnt == 0))
            {
                CoatingLiq--;
                cavailcnt = cmaxavailcnt;
            }
            if (tobearea == 0)
            {
                SourceCnt--;
                tobearea = RArea;
            }
            IsStart = true;
            int speed = 1000 / (SpinSpeed * CRadius * CRadius);
            if (speed ==0)
            {
                speed = 1;
            }
            timer = new Timer(Coting,null, 0, speed);
        }
        void Coting(object state)
        {
            cavailcnt--;
            tobearea--;
            if ((CoatingLiq == 0) && (cavailcnt < RArea))
            {
                Stop();
                return;
            }
            if(cavailcnt==0)
            {
                CoatingLiq--;
                cavailcnt = cmaxavailcnt;
            }

            if (tobearea == 0)
            {
                ProductCnt++;
                if (SourceCnt == 0)
                {
                    Stop();
                    return;
                }
                SourceCnt--;
                tobearea = RArea;
            }
            if (OnCoting != null)
            {
                OnCoting(this, new CotingEventArgs(
                    ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
            }
        }

        public void Stop()
        {
            timer.Dispose();
            IsStart = false;
            if (OnCoting != null)
            {
                OnCoting(this, new CotingEventArgs(
                    ProductCnt, SourceCnt, CoatingLiq, cavailcnt, tobearea));
            }
        }
    }
}

CotingEventArgs.cs

using System;

namespace 콘솔_예광탄
{
    public delegate void CotingEventHandler(object sender, CotingEventArgs e);
    public class CotingEventArgs:EventArgs
    {
        public int ProductCnt
        {
            get;
            private set;
        }
        public int SourceCnt
        {
            get;
            private set;
        }
        public int Liqid
        {
            get;
            private set;
        }
        public int AvailCnt
        {
            get;
            private set;
        }
        public int Tobe
        {
            get;
            private set;
        }
        public CotingEventArgs(int pc,int sc,int li,int ac,int tb)
        {
            ProductCnt = pc;
            SourceCnt = sc;
            Liqid = li;
            AvailCnt = ac;
            Tobe = tb;
        }
    }
}

Program.cs

using System;

namespace 콘솔_예광탄
{
    class Program
    {
        static void Main(string[] args)
        {
            RCMachine rc = new RCMachine();
            rc.OnCoting += Rc_OnCoting;
            rc.RArea = 100;
            rc.CoatingLiq = 2;
            rc.CRadius = 3;
            rc.SpinSpeed = 100;
            rc.SourceCnt = 10;
            rc.Start();
            Console.ReadKey();
        }

        private static void Rc_OnCoting(object sender, CotingEventArgs e)
        {
            Console.WriteLine("완성 개수:{0}", e.ProductCnt);
            Console.WriteLine("현재 코팅 중인 원판에 남은 면적:{0}", e.Tobe);
        }
    }
}
반응형