본문 바로가기
프로그래밍 이야기/GameDev

[C# 코딩연습] 임의의 성적표. 성적 추출

by Mulder5 2020. 12. 4.
반응형

문제 : 임의의 10인의 성적표를 만들고, 익명 함수, LINQ, Lamda를 이용해서 값을 정렬, 추출한다.

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

namespace LHHCheckPoint05
{
    class LHStudent
    {
        private int id;
        private int kor;
        private int eng;
        private int math;
        private int total;

        public LHStudent(int id, int kor, int eng, int math)
        {
            this.id = id;
            this.kor = kor;
            this.eng = eng;
            this.math = math;
            this.total = kor + eng + math;
        }

        public int ID { get { return id; } }
        public int KOR { get { return kor; } }
        public int ENG { get { return eng; } }
        public int MATH { get { return math; } }
        public int TOTAL { get { return total; } }
    }


    class Program
    {
        static void InitData(List<LHStudent> _listData)
        {
            Random rnd = new Random();

            for( int i = 0; i < 10; i++)
            {
                LHStudent data = new LHStudent(i, rnd.Next(0, 100), rnd.Next(0, 100), rnd.Next(0, 100));
                _listData.Add(data);
            }

            PrintData(_listData);
        }

        static void PrintData(List<LHStudent> _listData)
        {
            foreach(var data in _listData)
            {
                Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", data.ID, data.KOR, data.ENG, data.MATH, data.TOTAL);
            }
            
        }

        static void SortByID(List<LHStudent> _listData)
        {
            // 익명 함수로 정렬하기
            _listData.Sort(delegate(LHStudent a, LHStudent b)
            {
                if (a.ID > b.ID)
                {
                    return 1;
                }
                else if (a.ID < b.ID)
                {
                    return -1;
                }
                else
                {
                    return 0;
                }                    
            });

            Console.WriteLine("ID로 정렬 되었습니다.");
            PrintData(_listData);
        }

        static void SortByTotal(List<LHStudent> _listData)
        {
            // LINQ로 정렬하기

            var items = from item in _listData
                        orderby item.TOTAL descending   // 내림차
                        select item;

            List<LHStudent> sortedData = items.ToList<LHStudent>();
            Console.WriteLine("총점으로 정렬 되었습니다.");

            PrintData(sortedData);
            
        }

        static void SortByKor(List<LHStudent> _listData)
        {
            // Lamda로 정렬 (오름차순)
            _listData.Sort((LHStudent a, LHStudent b) => { return a.KOR - b.KOR; });

            PrintData(_listData);
        }

        static void FindData(List<LHStudent> _listData, bool isUp)
        {
            // 예외 처리

            Console.WriteLine("기준 점수를 입력하세요 :");
            string inputNum = Console.ReadLine();
            int num = 0;

            try
            {
                // 숫자만 입력 가능
                num = int.Parse(inputNum);
            }
            catch
            {
                // 숫자가 아닌 숫자가 입력되는 경우
                Console.Clear();
                Console.WriteLine("입력값 {0}은 잘못된 값입니다. 숫자만 입력하세요.", num);
            }
            finally
            {
                // 숫자가 입력되었지만 0보다 작은 수가 입력 된 경우
                if(num<0)
                {
                    Console.Clear();
                    Console.WriteLine("입력값 {0}은 잘못된 값입니다. 0보다 큰 값을 입력하세요.", num);
                }

                // 허용치보다 큰 값이 입력된 경우
                if(num > 300)
                {
                    Console.Clear();
                    Console.WriteLine("입력값 {0}은 잘못된 값입니다. 300보다 작은 값을 입력하세요.", num);
                }
            }

            if( num >= 0 && num <= 300)
            {
                // 입력된 값보다 큰 데이터 추출
                if(isUp)
                {
                    var findData = from item in _listData
                                   where item.TOTAL >= num
                                   select item;

                    List<LHStudent> data = findData.ToList<LHStudent>();
                    PrintData(data);
                    SortByID(data);
                    SortByTotal(data);
                }
                else
                {
                    List<LHStudent> data = _listData.FindAll(data => data.TOTAL <= num);

                    PrintData(data);
                    SortByID(data);
                    SortByTotal(data);

                }
            }


        }

        static void Main(string[] args)
        {
            List<LHStudent> listData = new List<LHStudent>();
            bool isLoop = true;

            InitData(listData);


            do
            {
                Console.WriteLine("메뉴를 입력하세요.");
                Console.WriteLine("(1)ID로 정렬 (2)총점으로 정렬 (3)국어 점수로 정렬 (4)특정 점수 이상 출력 (5)특정 점수 이하 출력");

                string inputString = Console.ReadLine();
                switch(inputString)
                {
                    case "0":
                        Console.WriteLine("프로그램이 종료 됩니다.");
                        isLoop = false;
                        break;

                    case "1":
                        SortByID(listData);
                        break;

                    case "2":
                        SortByTotal(listData);
                        break;

                    case "3":
                        SortByKor(listData);
                        break;
                    case "4":
                        break;
                    case "5":
                        break;
                    default:
                        Console.WriteLine("잘못된 수가 입력되었습니다.");
                        break;

                }

            } while (isLoop);


        }
    }
}

 

반응형

'프로그래밍 이야기 > GameDev' 카테고리의 다른 글

[게임이론] 삼각함수  (0) 2020.12.10
[C#] File - BinaryFormatter  (0) 2020.12.08
[C#] Lamda, Func, Action  (0) 2020.11.29
[C#] Delegate, Event  (0) 2020.11.26
C#코딩 연습 - Indexer  (0) 2020.11.21