퇴근5분전

간단히 학생들에 대한 점수 계산 후 ...

평점 순위별로 재정렬 하는 질문이었음.    참 재미있었음!!

쩝.. 분류를 어디다 넣는다!!.. ㅡ.,ㅡ;?


질문글
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=25054&Key=&Value=

답글
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=25061&Key=&Value=

<총점으로 정렬 하기>


<평균으로 정렬하기>


List<T> 를 이용해서 학생이 수강한 과목들을 가지는 학생정보를 생성하고
List<T> 를 이용해서 학생정보들을 취합한 학생들! 이란걸 만들었음.

그리고 학생들을 정렬시키는 조건이 되는 객체를 생성해서
Sort 에 넣어줌.

관련 링크는 아래 소스에 주석문에 포함되어있음.


* 학생정보들 이 되어야 될텐데.. 아차차!!!



<객체> 대충 그림.

사람 <-----  학생정보,
학생들 (*) ----- (1) ( 학생정보 (1) ---- (*) 과목 )
과목,
평균정렬, 총점정렬



// 설정
.net 2.0으로 제작!
폼 1개,
버튼 2개 -> 각 버튼별 Click이벤트 ,
리스트뷰 1개 -> View속성 -> View.List; 로 설정,




// 원본 소스
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        List<학생정보> 학생들 = new List<학생정보>();

        public Form1()
        {
            InitializeComponent();

            학생정보 a군 = new 학생정보("a군");
            a군.Add("영어", 10);
            a군.Add("국어", 50);
            a군.Add("수학", 40); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점        // 순위 확인을 위해
            학생정보 b군 = new 학생정보("b군");
            b군.Add("영어", 10);
            b군.Add("국어", 20);
            b군.Add("수학", 100);// 총 40   평 13
           
            학생정보 c군 = new 학생정보("c군");
            c군.Add("영어", 10);
            c군.Add("국어", 10);           
            c군.Add("수학",  40); // 총 20   평 10
            a군.평균구하기();
            b군.평균구하기();
            c군.평균구하기();
            학생들.Add(a군);
            학생들.Add(b군);
            학생들.Add(c군);
            listView1.View = View.List;

// 리스트 뷰에 아이템 컬럼 추가하기
            listView2.View = View.Details;
            listView2.Columns.Add("이름", "이름");
            listView2.Columns.Add("과목수", "과목수");
            listView2.Columns.Add("총점", "총점");
            listView2.Columns.Add("평균", "평균");
            listView2.Columns.Add("영어", "영어");
            listView2.Columns.Add("국어", "국어");
            listView2.Columns.Add("수학", "수학");
            comboBox1.DataSource = Enum.GetNames(typeof(View));
           
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Text = "평균정렬";
            학생들.Sort(new 평균비교());
            Display();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            this.Text = "총점정렬";
            학생들.Sort(new 총점비교());
            Display();
        }
        public void Display()
        {
            listView1.Items.Clear();
            listView2.Items.Clear();
            foreach (학생정보 정보 in 학생들)
            {
                this.listView1.Items.Add(정보.ToString());

// 리스트 뷰에 아이템 추가하기
// [정보.이름]은 이미지에서 보다싶이 첫번재 컬럼에 들어감.
                ListViewItem _정보 = new ListViewItem(정보.이름);      
                _정보.SubItems.Add(정보.과목수.ToString() );
                _정보.SubItems.Add(정보.총점.ToString() );
                _정보.SubItems.Add(정보.평균.ToString() );
                _정보.SubItems.Add(정보["영어"].ToString() );
                _정보.SubItems.Add(정보["국어"].ToString() );
                _정보.SubItems.Add(정보["수학"].ToString() );              
                this.listView2.Items.Add(_정보);
            }
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            View v = listView2.View;
            try
            {
                this.Text = "";
                listView2.View = (View)Enum.Parse(typeof(View ),  comboBox1.SelectedItem.ToString());
            }
            catch
            {
                this.Text = "err";
                listView2.View = v;
            }
        }    
    }
 
        #region  계산용 -- 클래스
        /// <summary>
        /// <para>  List.Sort  메서드 도움말 참조 </para>   
        /// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx  참고!    
        /// </summary>
        public class 평균비교
            : IComparer<학생정보>
        {
            #region IComparer<학생정보> 멤버
            public int Compare(학생정보 x, 학생정보 y)
            {
                if (x == null)
                {
                    if (y == null)
                    {
                        return 0;
                    }
                    return -1;
                }
                else
                {
                    if (y == null)
                    {
                        return 1;
                    }
                    if (x.평균 > y.평균)
                    {
                        return 1;
                    }
                    else if (x.평균 < y.평균)
                    {
                        return -1;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            #endregion
        }
        /// <summary>
        /// <para>  List.Sort  메서드 도움말 참조 </para>   
        /// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx  참고!    
        /// </summary>
        public class 총점비교 : IComparer<학생정보>
        {
            #region IComparer<학생정보> 멤버
            public int Compare(학생정보 x, 학생정보 y)
            {
                if (x == null)
                {
                    if (y == null)
                    {
                        return 0;
                    }
                    return -1;
                }
                else
                {
                    if (y == null)
                    {
                        return 1;
                    }
                    if (x.총점 > y.총점)
                    {
                        return 1;
                    }
                    else if (x.총점 < y.총점)
                    {
                        return -1;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            #endregion
        }
        #endregion

    public class 사람
    {
        private string __이름 = string.Empty;
        public string 이름
        {
            get { return __이름; }
            //set { __이름 = value; }
        }
        public 사람(string 사람이름)
        {
            this.__이름 = 사람이름;
        }
        public override string ToString()
        {
            return string.Format("나는 {0}입니다." + Environment.NewLine, __이름);
        }
    }

    public class 학생정보 : 사람
    {
        public 학생정보(): base("홍길동")
        {           
        }
        public 학생정보(string 이름): base(이름)
        {}

        List<과목> 수강과목 = new List<과목>();
        public int 과목수
        {
            get { return 수강과목.Count; }
        }
        public int this[string ___과목명]
        {
            get {
                foreach (과목 item in 수강과목)
                {
                    if (item.p과목명 == ___과목명)
                    {
                        return item.점수;                        
                    }
                }
                return -1;
                // throw new Exception("과목이없음.");
                }
        }

        public void Add(과목 과목)
        {
            수강과목.Add(과목);
        }
        public void Add(string _과목명, int _점수)
        {
            Add( new 과목( _과목명, _점수 ));
        }
        int __평균 = 0;
        public int 평균
        {
            get { return __평균; }
       //     set { __평균 = value; }
        }
        int __총점 = 0;
        public int 총점
        {
            get { return __총점; }
         //   set { __총점 = value; }
        }
        public void 평균구하기()
        {
            if (수강과목.Count <= 0)
            {
                __평균 = __총점 = 0;
                return;
            }
            총점구하기();           
            this.__평균 = __총점 / 수강과목.Count;
        }
        private void 총점구하기()
        {
            foreach (과목 item in 수강과목)
            {
                __총점 += item.점수;
            }
        }
        public override string ToString()
        {
            string ret = base.ToString(); 
            ret += string.Format(" 과목수:{2}, 총점:{0} , 평균:{1} 입니다" +Environment.NewLine, __총점, __평균, 수강과목.Count);
            foreach (과목 item in 수강과목)
            {
                ret += item.ToString();
            }
        
            return ret + Environment.NewLine;
        }  
    }

    public class  과목
    {
        public 과목(string _과목명,  int _점수)
        {
            __과목명 = _과목명;
            __점수 = _점수;
        }
        string __과목명 = string.Empty;
        public string p과목명
        {
            get { return __과목명; }
        //    set { 과목명 = value; }
        }
        int __점수 = 0;
        public int 점수
        {
            get { return __점수; }
            //set { __점수 = value; }
        }
        public override string ToString()
        {
            return string.Format("{0} 과목의 점수는 {1}점입니다. "+Environment.NewLine, __과목명, __점수);
        }
    }

}

'# 1) 프로그래밍' 카테고리의 다른 글

VS : 정의 보기 -> 되돌아가기.. 단축키  (1) 2010.01.22
나만에 개발방법...  (0) 2010.01.13
디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10