체감온도(Wind Chill Temperature)와 열지수(Heat Index)를 구하는 Windows Forms 응용프로그램을 작성한다.
lecture9
HW3
연습문제 (3)
□ 단원 : C# 기초 □ 목표 : C# 객체지향 프로그래밍 □ 주요 연습 내용 : collections, class, interface, 속성, FileIO, LINQ 연습 □ 준비자료 : 기상데이터 |
연습문제 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
- .NET2010
Visual C# Windows Forms Application 프로젝트 새로 만들기
Dialog-based App 프로젝트 새로 만들기
- 메뉴에서 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)하기
lecture8
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();
}
PersonLibCollectionTest
PersonLibCollectionTest
-PersonLib.dll 사용 (Person.cs & PersonComparer.cs)
-List<Person> 사용
-FileIO 사용
C# Point & Point3D Class Assembly
# Point & Point3D Class 를 DLL로 작성한후 PointTest 클래스에서 사용
새프로젝트 -> Class Library 선택해서 PointLib 로 생성
컴파일 후에 PointLib.dll 생성
—————————————————————————————————————-
PointLib.dll 을 다른 프로그램에서 사용하기
새프로젝트 -> Console Application 로 선택해서 PointTest 생성
소스코드 추가 후에 Reference에 PointLib.dll을 추가하기
컴파일 후 PointTest.exe 생성
FileIO
FileIO
http://support.microsoft.com/kb/304430
-한글 텍스트파일 읽기와 쓰기
-csv 파일 Parse 하기
C# generic class vs C++ STL
C#
http://msdn.microsoft.com/en-us/library/sz6zd40f(VS.80).aspx
C++ Standard Template Library
http://dis.dankook.ac.kr/lectures/hci07/entry/lecture2-template