All posts by kpark

HW3

연습문제 (3)







단원 : C# 기초


목표 : C# 객체지향 프로그래밍


주요 연습 내용 : collections, class, interface, 속성, FileIO, LINQ 연습


준비자료 : 기상데이터


  8043775710.zip


연습문제 Ex3 (Due by 11/15 24시까지)


-cyber 강의실 (cyber.dku.edu)source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex3.zip으로 묶어서 낼 것. 보고서 (30%)


 


[연습문제]


1. WeatherInfo.cs 파일에 WeatherInfo 클래스를 정의하라. (10%)


다음 속성(Property)를 지정하여 외부에서 사용할 수 있도록 한다.


– public int Year { get; set;}


– public int Month { get; set;}


– public int Day { get; set;}


– public double MaximumTemperature { get; set;} // 최대기온 (섭씨 도)


– public double AverageTemperature{ get; set;} // 평균기온 (섭씨 도)


– public double LowTemperature{ get; set;} // 최저기온 (섭씨 도)


– public double Humidity { get; set;} // 평균습도(%)


– public double Wind { get; set;} // 평균풍속 (m/s)


– public double DaylightHours { get; set;} // 일조시간 (hr)


– public double Precipitation{ get; set;} // 강수량 (mm)


– public double SnowAccumulation { get; set;} // 최심신적설 (cm)


– public double AverageCloudCover { get; set;} // 일평균운량 ()




– public double WindChillTemperature { get; } // 체감온도 (11~3) 내부구현필요


– public double HeatIndex{ get; } // 열지수 (6~9) 내부구현필요


또한 다음 메소드를 포함한다.


– WeatherInfo() // 기본 생성자 내부구현 필요


– WeatherInfo(int, int, int, double, double, double, double, double, double, double, double, double)// 생성자 내부구현필요


– public override string ToString() // WeatherInfo의 모든 정보를 csv 포맷으로 출력하는 메소드 내부구현 필요


 


2. WeatherInfo클래스에 IComparable<WeatherInfo>IEquatable<WeatherInfo> 인터페이스를 상속받고 다음 메소드를 구현한다. (10%)


– public int CompareTo(WeatherInfo other) { // Year 순서대로 비교하는 내부구현 필요}


– public bool Equals(WeatherInfo other) { // Year & Month & Day가 일치하는지 내부구현 필요 }


 


3. WeatherInfoComparer.cs 파일에는 IComparer<WeatherInfo> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다. WeatherInfoManager 클래스의 Sort 메소드에서 사용됨. (10%)


– class WeatherYearComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherMonthComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherDayComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherTemperatureComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherHumidityComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherWindComparer: IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


– class WeatherPrecipitationComparer : IComparer<WeatherInfo>


{ public int Compare(WeatherInfo p, WeatherInfo q) // 내부구현 필요 }


 


4. WeatherInfoManager.cs 파일에는 WeatherInfoManager 클래스를 정의하라. (10%)


http://msdn.microsoft.com/en-us/library/system.collections.arraylist(VS.71).aspx


SortMode 열거형을 정의한다.


enum SortMode { Year, Month, Day, Temperature, Humidity, Wind, Precipitation }


WeatherInfoManager클래스는 리스트를 데이터 멤버로 포함한다.


public List<WeatherInfo> wList = new List<WeatherInfo>();


그리고 메소드는 다음을 포함한다. 


// 선택한 모드에 따라서 리스트의 데이터를 Year, Month, Day, Temperature, Humidity, Wind, Precipitation 순서로 정렬


// WeatherMonthComparer, WeatherDayComparer 등 사용


– public void Sort(SortMode mode) { // 내부구현 필요 }


// 리스트에 모든 WeatherInfo를 출력


– public void Print() { foreach (var w in wList) Console.WriteLine(w); }


5. WeatherInfoFileManager.cs 파일에는 WeatherInfoFileManager 클래스를 정의하라. (10%)


// 지정한 디렉토리 (path)에 지정한 파일확장자 (ext)인 모든 파일을 읽어서 Import


– public static void Import(string path, string ext, ref List<WeatherInfo> tList) { // 내부적으로 Import(string filename, ref List<WeatherInfo> tList) 호출 }


// cvs(comma separated value) 텍스트를 읽어서 wList에 추가


// StreamReader 사용


– public static void Import(string filename, ref List<WeatherInfo> tList) { // 내부구현 필요 }


// 지정한 파일명(filename)으로 tList의 모든 원소를 cvs(comma separated value) 텍스트로 저장


// StreamWriter 사용


– public static void Export(string filename, ref IList<WeatherInfo> tList) { // 내부구현 필요 }


 


6. WeatherInfoManger클래스 또는 Program 클래스의 Main 함수에서 본인이 더 테스트해보고 싶은 Method를 추가하라. 디렉토리에 데이터를 읽어서, 여러 가지 방법으로 정렬 및 LINQ 쿼리를 한 후 새로운 파일에 저장한다. (20%)



// LINQ를 이용하여 리스트에서 지정한 평균온도 내에 있는 것만 List로 추출


public IList<WeatherInfo> GetWeatherInfoListByTemperatureRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용  }


 


// LINQ를 이용하여 리스트에서 지정한 평균습도 내에 있는 것만 List로 추출


public IList<WeatherInfo> GetWeatherInfoListByHumidityRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용 }


 


// LINQ를 이용하여 11~ 익년 3월 기간 동안 것만 List로 추출하여 체감온도 계산


// LINQ를 이용하여 6~ 9월 기간 동안의 것만 List로 추출하여 열지수 계산


public IList<WeatherInfo> GetWeatherInfoListByMonthRange(double min, double max) { // 내부구현 필요 – LINQ 와 ToList() 사용  }


VC# Windows Forms Application




  • 메뉴에서 File->New->Project->Visual C# 템플릿->Windows Forms Application를 선택한 후 “프로젝트 이름(예를 들어, WindowFormHelloWorldApplication)”을 적고 확인버튼을 누르면 빈폼 프로젝트가 생성된다.


사용자 삽입 이미지


사용자 삽입 이미지

사용자 삽입 이미지

코드 추가

  • Toolbox(도구상자) 에서 컨트롤을 선택(예를 들어, Label 또는 Button)하여 Dialog기반의 Form 안에 추가하여 편집한다.


사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

컨트롤에 이벤트 추가하기
-컨트롤 (예를들어, 버튼을 더블클릭하면 또는 이벤트목록중 Click이벤트에 더블클릭하면)에 클릭 이벤트에 대한 이벤트핸들러에 내용(예를 들어, 레이블의 Text를 “Button Clicked”)을 작성한다.

private void button1_Click(object sender, EventArgs e)
{
// button1을 클릭하면 label1에 “Button Clicked”출력
label1.Text = “Hello World!”;
}


빌드(F7) 후 실행(F5)하기

사용자 삽입 이미지

LINQ

        static void Main(string[] args)
        {
            // The Three Parts of a LINQ Query:
            //  1. Data source.
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };


            // 2. Query creation.
            // numQuery is an IEnumerable<int>
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;


            // 3. Query execution.
            foreach (int num in numQuery)
            {
                Console.Write(“{0,1} “, num);
            }

            Console.WriteLine();


            // LIST
            List<Person> pList = new List<Person>();
            pList.Add(new Person(“둘리”, 1, “123-4568-9012”, “대한민국”));
            pList.Add(new Person(“희동이”, 3, “000-0000-0000”, “서울”));
            pList.Add(new Person(“고길동”, 2, “000-0000-0000”, “서울”));
            pList.Add(new Person(“도우너”, 5, “000-0000-0000”, “온따빠야별”));
            pList.Add(new Person(“또치”, 4, “000-0000-0000”, “라스베가스”));
            pList.Insert(2, new Person(“마이콜”, 6, “000-0000-0000”, “서울”));
            IEnumerable<Person> seoulQuery =
                from per in pList
                where per.Address == “서울”
                select
per;


            foreach (var per in seoulQuery)
            {
                Console.WriteLine(per.Name + “, ” + per.ID);
            }
            Console.WriteLine();


            // query syntax
            IEnumerable<Person> personQuery =
                from p in pList
                where (p.ID < 2) || (p.Address == “서울”)
                orderby p.Name ascending
                select p;


            foreach (var p in personQuery)
            {
                Console.WriteLine(p.Name + “, ” + p.ID);
            }
            Console.WriteLine();


            // method syntax
            IEnumerable<Person> personQuery2 = pList.Where(p => (p.ID < 2) || (p.Address == “서울”)).OrderBy(p => p);


            foreach (var p in personQuery2)
            {
                Console.WriteLine(p.Name + “, ” + p.ID);
            }
            Console.WriteLine();
        }

C# Point & Point3D Class Assembly

# Point & Point3D Class 를 DLL로 작성한후 PointTest 클래스에서 사용

PointClassAssembly.zip

새프로젝트 -> Class Library 선택해서 PointLib 로 생성

사용자 삽입 이미지
컴파일 후에 PointLib.dll 생성

사용자 삽입 이미지
—————————————————————————————————————-
PointLib.dll 을 다른 프로그램에서 사용하기
새프로젝트 -> Console Application 로 선택해서 PointTest 생성
사용자 삽입 이미지
소스코드 추가 후에 Reference에 PointLib.dll을 추가하기

사용자 삽입 이미지

사용자 삽입 이미지
컴파일 후 PointTest.exe 생성

사용자 삽입 이미지