프로그래밍/코드 정리

[C#] 성적 정렬 프로그램

NIA1995 2021. 3. 29. 01:19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace @Sort
{
    class Program
    {
        class StudentData
        {
            private int id;
            private int kor;
            private int math;
            private int eng;
            private int total;

            public int ID
            {
                get { return id; }
            }

            public int Kor
            {
                get { return kor; }
            }

            public int Math
            {
                get { return math; }
            }

            public int Eng
            {
                get { return eng; }
            }

            public int Total
            {
                get { return total; }
            }

            public StudentData(int id, int kor, int math, int eng)
            {
                this.id = id;
                this.kor = kor;
                this.math = math;
                this.eng = eng;

                total = kor + math + eng;
            }
        }

        static void Main(string[] args)
        {
            List<StudentData> dataList = new List<StudentData>();

            bool isLoop = true;

            InitData(dataList, 20);

            do
            {
                Console.WriteLine("메뉴를 골라주세요 !");
                Console.Write("(1)id정렬 (2)성적 순 정렬 (3) 국어 점수 정렬 (4)특정 점수 이상 (5)특정 점수 이하 (0)나가기");
                string inputNum = Console.ReadLine();

                switch (inputNum)
                {
                    case "0":
                        Console.WriteLine("프로그램 종료");
                        isLoop = false;
                        break;

                    case "1":
                        SortDataByID(dataList);
                        break;

                    case "2":
                        SortDataByTotal(dataList);
                        break;

                    case "3":
                        SortDataByKor(dataList);
                        break;

                    case "4":
                        SortData(dataList, true);
                        break;

                    case "5":
                        SortData(dataList, false);
                        break;

                    default:
                        Console.Clear();
                        Console.WriteLine("다시 입력해 주세요!");
                        break;
                }

            } while (isLoop);
        }

            static void InitData(List<StudentData> dataList, int initCount)
        {
            Random rnd = new Random();

            for(int i = 0; i < initCount; ++i)
            {
                dataList.Add(new StudentData(i+1, rnd.Next(0, 101), rnd.Next(0, 101), rnd.Next(0, 101)));
            }
        }

        static void PrintData(List<StudentData> dataList)
        {
            Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", "ID", "KOR", "MATH", "ENG", "TOTAL");
            Console.WriteLine("---------------------------------------");

            for(int i = 0; i < dataList.Count(); ++i)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", dataList[i].ID, dataList[i].Kor, dataList[i].Math, dataList[i].Eng, dataList[i].Total);
            }
        }

        static void SortDataByID(List<StudentData> listData)
        {
            listData.Sort(delegate (StudentData a, StudentData b)
            {
                if (a.ID > b.ID)
                {
                    return 1;
                }
                else if (a.ID < b.ID)
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            });

            Console.WriteLine("아이디 정렬 !");
            PrintData(listData);
        }

        static void SortDataByTotal(List<StudentData> listData)
        {
            /* var data = 와 같다. */
            IOrderedEnumerable<StudentData> data = 
                from item in listData
                orderby item.Total descending
                select item;

            List<StudentData> sortedData = data.ToList();

            Console.WriteLine("총점 정렬 !");
            PrintData(sortedData);
        }

        static void SortDataByKor(List<StudentData> listData)
        {
            listData.Sort((StudentData a, StudentData b) =>
            {
                return b.Kor - a.Kor;
            });

            Console.WriteLine("국어 기준 정렬 !");
            PrintData(listData);
        }

        static void SortData(List<StudentData> listData, bool isASC)
        {
            Console.Write("기준 점수 입력 : ");
            string targetScore = Console.ReadLine();

            int num = 0;

            try
            {
                num = int.Parse(targetScore);
            }
            catch(FormatException e)
            {
                Console.Clear();
                Console.WriteLine("올바르지 않은 문자 형식입니다. 숫자만 입력 가능 합니다!");
            }
            finally
            {
                if(num < 0)
                {
                    Console.Clear();
                    Console.WriteLine("잘못된 입력 범위 입니다. -1보다 큰 수를 입력하세요 !");
                }
                
                if(num > 300)
                {
                    Console.Clear();
                    Console.WriteLine("잘못된 입력 범위 입니다. 301보다 작은 수를 입력하세요 !");
                }
            }

            if(num > -1 && num < 301)
            {
                if(isASC)
                {
                    var datas =
                        from item in listData
                        where item.Total >= num
                        select item;

                    List<StudentData> sortedData = datas.ToList();

                    PrintData(sortedData);
                }
                else
                {
                    var datas =
                            from item in listData
                            where item.Total <= num
                            select item;

                    List<StudentData> sortedData = datas.ToList();

                    PrintData(sortedData);
                }
            }         
        }
    }
}