# Convert (Longitude, Latitude) to (X, Y) on a map

// Get the latitude as a value between 0 and 180,
// where the negative values represent values South of the Equator
double latitude = lat + 90.0;
// Get the longitude as a value between 0 and 360,
// where the negative values represent values West of the Greenwich Meridian.
double longitude = lon + 180.0;

// calculate how many pixels are needed to represent each degree for width and height
double pixelsWidth = map.Width/360.0;
double pixelsHeight = map.Height/180.0;

// Calculate how many pixels we need to represent our latitude value
double latitudePixels = latitude * pixelsHeight;
// Calculate how many pixels we need to represent our longitude value
double longitudePixels = longitude * pixelsWidth;

// The X coordinate of our point is the longitudePixels value
float x = (float)longitudePixels;
// The Y coordinate of our point is 180-latitude
// since the Y axis is facing down but the map is facing up
float y = (float) ((180.0 * pixelsHeight) – latitudePixels);

# IEquatable.Equals

http://msdn.microsoft.com/ko-kr/library/ms131190(VS.95).aspx

// Person 클래스
public class Person : IEquatable<Person>
{
// …
public Person(string name, int age)
{
_name = name;
_age = age;
}

public override string ToString()
{
return string.Format(“이름 : {0}\t나이 : {1}”, _name, _age);
}

// needed for ==
public static bool operator == (Person p, Person q)
{
return p.Equals(q);
}

public static bool operator != (Person p, Person q)
{
return !p.Equals(q);
}

public override int GetHashCode()
{
return base.GetHashCode();
}

public override bool Equals(object obj)
{
return Equals((Person)obj);
}

public bool Equals(Person other)
{
if (object.ReferenceEquals(this, other))
return true;
return (Name==other.Name) && (Age==other.Age);
}
}

// aList에 포함된 세 사람 중에 둘리와 일치하는 사람이 있는지 확인한다
private static void Main(string[] args)
{
List<Person> aList = new List<Person>();

Person s = new Person(“둘리”, 1000);
bool result = false;
foreach (Person p in aList)
{
if (p == s)
{
result = true;
break;
}
}

// 또는 foreach를 사용하는 방법대신, List에 Find 또는 FindIndex를 사용한다.
Person f = aList.Find(delegate(Person o)
{
return o == s; // 리스트에 o가 s와 일치하는 것이 있으면 그 Person 반환
}
);

int index = aList.FindIndex(delegate(Person o)
{
return o == s; // 리스트에 o가 s와 일치하는 것이 있으면 그 index 반환
}
);

}

# Assignment 4

연습문제 (4)

□ 단원 : C# WinForm
□ 목표 : Collections & FileIO & C# WinForm & Controls & GDI+ & Dialog
□ 주요 연습 내용 : Graphics, ListView
□ 준비자료 : QuakeData.cs 지진데이터

4100722456.txt
[연습문제] Ex4 (Due by 12/06 화 24시까지)
-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex4.zip으로 묶어서 낼 것. 보고서 (30%)

[연습문제]

1. QuakeDataComparer.cs 파일에는 IComparer<QuakeData> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다.  QuakeDataManager.cs에서 qList의 SortList에 사용됨. (10%)
– class QuakeMonthComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeDayComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeTimeComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeLatComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeLonComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeMagnitudeComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeDepthComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }

2. ListViewItemComparer.cs 파일에는 IComparer 인터페이스를 상속받은 ListViewIntegerItemComparer와 ListViewDoubleItemComparer 클래스를 구현한다. MainForm.cs에서 ListView의 SortListView에 사용됨. (10%)
(힌트: http://msdn.microsoft.com/en-us/library/ms996467.aspx)
– class ListViewIntegerItemComparer : IComparer
{ public int Compare(object x, object y) // 내부구현 필요 }
– class ListViewDoubleItemComparer : IComparer
{ public int Compare(object x, object y) // 내부구현 필요 }

3. QuakeDataManager.cs에 QuakeDataManager 클래스를 구현한다. (10%)
– private List<QuakeData> pList = null;
그리고 메소드는 다음을 포함한다.
// cvs(comma separated value) 파일을 읽어서, QuakeData를 pList에 추가
– public void LoadFile(string path, ref List<QuakeData> pList) { // 내부구현필요 }
// pList의 모든 QuakeData를 cvs(comma separated value) 텍스트 파일로 저장
// StreamWriter 사용
– public void WriteFile(string path) { // 내부구현 필요 }
// 리스트 데이터를  Year, Month, Day, Time, Lat, Lon, Magnitude, Depth 순서로 정렬
// QuakeMonthComparer, QuakeDataComparer, QuakeTimeComparer 등을 사용
– public void SortList(int index) { // 내부구현 필요 }

4. MainForm에 메뉴, 툴바, 탭컨트롤을 추가한다. (10%)

File 메뉴항목
-New: 새로 그리기
-Open/Save: 열기/저장하기
-Print: 프린트로 출력하기 (optional)
-Exit: 응용프로그램 종료
Data 메뉴항목
-Find : 자료 찾기
View 메뉴항목
-List: 리스트뷰로 보기
-Map: 맵뷰로 보기

툴바에 메뉴 항목과 동일한 내용을 추가한다.
-New/Open/Save/Print/Close 메뉴항목 => New/Open/Save/Print/Close 툴바 버튼 추가
-Data 메뉴 항목=> Find Data 툴바 버튼 추가
-View 메뉴 항목 => ListView/MapView 툴바 콤보박스 추가

탭컨트롤에는 ListView와 PictureBox 컨트롤을 추가한다.
-첫 번째 TabPage에는 ListView를 추가하고, View는 Detail로 바꾼 후, Data를 보여줄 수 있도록 Column Header (Year/Month/Day/Time/Latitude/Longitude/Magnitude/Depth) 추가

-두 번째 TabPage에는 PictureBox를 추가하고, BackgroundImage로 Image에 Resources 디렉토리 안에 있는 “2_no_clouds_2K.jpg”를 추가

4. MainForm에 각종 이벤트 핸들러를 추가한다. (30%)
– private List<QuakeData> pList = new List<QuakeData>();
– private QuakeDataManager manager = new QuakeDataManager();
그리고 메소드는 다음을 포함한다.
// Exit – 메인폼을 닫고 응용프로그램 종료
– private void exitToolStripMenuItem_Click(object sender, EventArgs e) { … }
// Open – 파일을 읽어서 pList에 데이터를 로딩하고 listView와 pictureBox를 update
– private void openToolStripMenuItem_Click(object sender, EventArgs e) { … }
// Save – pList 데이터를 파일에 저장
– private void saveToolStripMenuItem_Click(object sender, EventArgs e) { …}
// 리스트컬럼클릭 – 클릭된 컬럼을 기준으로 정렬
// QuakeDataManager의 SortList와 listView의 SortListView를 사용
– private void listView1_ColumnClick(object sender, EventArgs e) { … }
// 리스트뷰의 정렬
// ListViewIntegerItemComparer와 ListViewDoubleItemComparer를 사용
– private void SortListView(int index) { … }

// listView와 pictureBox의 탭페이지 선택을 바꿔주는 메뉴항목과 탭컨트롤에서 페이지를 직접 선택할 시 메뉴항목에 Checked 업데이트
– private void listToolStripMenuItem_Click(object sender, EventArgs e) { …}
– private void mapToolStripMenuItem_Click(object sender, EventArgs e) { …}
– private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { …}
// MainForm의 Resize할 때 listView와 pictureBox 무효화를 사용해 다시 그리기
– private void MainForm_Resize(object sender, EventArgs e) { …}

5. 비모달형 대화상자 (Modeless Dialog)인 SearchForm을 새로 추가하고 MainForm과 연동한다. (extra 10%)
– 전체 리스트에서 일정 영역만 Search해서 listView와 pictureBox에서 나타낼 수 있는
SearchForm 대화상자를 추가한다.

6. 본인이 원하는 기능을 더 추가하고, 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)

결과예시:

# PhotoViewer template

PhotoViewer template9498974843.zip

# resizeImage

private void resizeImage(Image fullsizeImage, string destFilename, int destWidth, int destHeight)
{
// Prevent using images internal thumbnail
fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
// Resize the image
Image destImage = fullsizeImage.GetThumbnailImage(destWidth, destHeight, null, IntPtr.Zero);
// Save the resized picture
destImage.Save(destFilename);
System.Diagnostics.Trace.WriteLine(“Debug: Path=” + destFilename);
}

# Assignment 3

연습문제 (3)

 □ 단원 : C# WinForm □ 목표 : C# Form, Controls, GUI, Dialog □ 주요 연습 내용 : collections, class, Form, 속성, FileIO 연습 □ 준비자료 : Photo.cs7134993273.cs

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

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

[연습문제]

1. MainForm에 메뉴, 툴바, 탭컨트롤을 추가한다. (10%)
+File
+Open: 이미지 폴더 열기

+Exit: 응용프로그램 종료

+Image

+Resize: 전체 이미지 사이즈 일괄 변경하기
– listView & imageList
– folderBrowser
– statusStrip

2. 모달형 대화상자 (Moal Dialog)인 DetailForm을 새로 추가하고 Photo를 보여준다. (10%)
– pictureBox
– button (Previous/Next/Slideshow)

+Previous 버튼이 Click되면, 이전 사진을 보여준다

+Next 버튼이 Click되면, 다음 사진을 보여준다

+Slideshow 버튼이 Click되면, 디렉토리의 전체 사진을 슬라이드쇼로 보여준다
– timer

+타이머가 Tick되면, 다음 사진을 보여준다

3. 모달형 대화상자 (Moal Dialog)인 ResizeForm을 새로 추가하고, 크기조절 비율과 저장 디렉토리를 입력받아 사진 크기변환을 할 수 있다. (10%)
– label & button
– listBox
– textBox

4. MainForm 에는 프로그램을 정의한다. (20%)
– public List<Photo> pList = new List<Photo>();
// 응용프로그램을 종료한다.
– private void exitToolStripMenuItem_Click(object sender, EventArgs e)

// folderBrowserDialog를 이용하여 선택한 디렉토리에 모든 이미지(Photo)를
// List<Photo>와 imageList와 listView에 추가한다.
– private void openToolStripMenuItem_Click(object sender, EventArgs e)

// ResizeForm 대화상자를 열어서 입력받은 크기비율과 저장디렉토리에
// 모든 이미지를 크기변환(제공하는 resizeImage를 사용)한다.
– private void resizeToolStripMenuItem_Click(object sender, EventArgs e)

// listView에 이미지를 선택하면, DetailForm 대화상자를 열어준다.
// 현재 선택한 이미지의 정보를 statusStrip에 출력해준다.
– private void listView1_ItemSelectionChanged(object sender, EventArgs e)

5. DetailForm 클래스 또는 ResizeForm 클래스에 이벤트 핸들러를 구현하고 본인이 원하는 기능을 더 추가한다. (20%)

DetailForm클래스

// DetailForm이 로딩되면 리스트뷰에서 선택된 사진을 보여준다.

– private void DetailForm_Load(object sender, EventArgs e)

// Previous 버튼을 누르면 이전 사진을 보여준다

– private void button1_Click(object sender, EventArgs e)

// Next 버튼을 누르면 다음 사진을 보여준다.
– private void button2_Click(object sender, EventArgs e)

// Slideshow 버튼을 누르면 슬라이드쇼를 한다.
// (즉, timer를 활성화시킨다. 즉, Tick 이벤트가 실행되게 한다.)
– private void button3_Click(object sender, EventArgs e)

ResizeForm클래스

// listBox1에서 사용자가 원하는 퍼센티지(%)를 선택할 수 있다.

– private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

// textBox1를 마우스로 누르면 folderBrowserDialog1를 불러 크기변환된 파일을 저장할 디렉토리를 지정할 수 있다. (folderBrowserDialog1.ShowNewFolderButton = true)
– private void textBox1_Enter(object sender, EventArgs e)

# C# Formatting Numeric String

Formatting Standard Numeric Format Strings
http://msdn.microsoft.com/en-us/library/s8s7t687(VS.80).aspx

Formatting Custom Numeric Format Strings
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Formatting Numeric Format Strings (Alignment)
Integer    http://www.csharp-examples.net/string-format-int/
Double    http://www.csharp-examples.net/string-format-double/
DateTime http://www.csharp-examples.net/string-format-datetime/
Align String with Spaces  http://www.csharp-examples.net/align-string-with-spaces/
Indent String with Spaces http://www.csharp-examples.net/indent-string-with-spaces/
IFormatProvider               http://www.csharp-examples.net/iformatprovider-numbers/
Custom IFormatProvider   http://www.csharp-examples.net/custom-iformatprovider/

 Character Description Examples Output C or c Currency Console.Write(“{0:C}”, 2.5); \$2.50 Console.Write(“{0:C}”, -2.5); (\$2.50) D or d Decimal Console.Write(“{0:D5}”, 25); 25 E or e Scientific Console.Write(“{0:E}”, 250000); 2.50E+05 F or f Fixed-point Console.Write(“{0:F2}”, 25); 25 Console.Write(“{0:F0}”, 25); 25 G or g General Console.Write(“{0:G}”, 2.5); 2.5 N or n Number Console.Write(“{0:N}”, 2500000); 2,500,000.00 X or x Hexadecimal Console.Write(“{0:X}”, 250); FA Console.Write(“{0:X}”, 0xffff); FFFF

# C# Array/ArrayList

Person[] pArray = new Person[5];

// 만약 Person 객체를 하나만 생성한 후 for문에서 공유해 사용할 경우
// 마지막으로 입력된 데이터로 모든 데이터값이 치환됨
Person p = new Person();
for (int i = 0; i < 5; i++) {
pArray[i] = p;                                  // 리스트에 들어간 모든 원소는 동일한 p
}

Person[] pArray = new Person[5];

// 아래와 같이 for문 안에 Person p = new Person()와같이 새로운 객체를 생성해야
// 각자 다르게 입력된 정보가 들어가게 됨
for (int i = 0; i < 5; i++) {
Person p = new Person();
pArray[i] = p;                                  // 이때 p는 새로운 Person객체
}

http://dis.dankook.ac.kr/lectures/hci10/entry/C-ArrayList
(ArrayList 사용예)

# Assignment 2

연습문제 (2)

□ 단원 : C# 기초
□ 목표 : C# 프로그램 기초
□ 주요 연습 내용 : array (또는 ArrayList), foreach, 속성, 클래스, 상속 연습9481023359.cs연습문제 Ex2 (Due by 10/14 금 24시까지)
-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex2.zip으로 묶어서 낼 것. 보고서 (30%)

[연습문제]
1. Person 클래스를 정의하라 (그리고, Person.cs 파일로 저장한다). (20%)
Person 클래스는 이름, 나이, 신장, 체중, 성별을 데이터 멤버로 포함한다.
– private string name;
– private int age;
– private float height;
– private float weight;
– private Gender gender; // Gender는 enum 타입 {Female, Male}
– private Activity activity; // Activity는 enum 타입 {Low, Medium, High}

각 멤버 필드에 대한 속성(Property)를 지정하여 외부에서 사용할 수 있도록 한다.
– public string Name { get; set;} // get과 set에 대한 내부정의 필요
– public int Age { get; set;}
– public float Height { get; set;}
– public float Weight { get; set;}
– public Gender Gender { get; set;}
– public Activity Activity { get; set;}

그리고 메소드는 다음을 포함한다.
– public Person()                // 기본 생성자
– public Person(string, int, float, float, Gender)  // 형변환 생성자
– public virtual void Print() // Person의 이름, 나이, 신장, 몸무게, 성별, 활동량을 출력
– public override string ToString() // Print와 동일하게 string으로 출력

2. Person 클래스에서 상속받은  PersonDailyCaloricIntakeCalculator 클래스를 정의하라 (그리고, PersonDailyCaloricIntakeCalculator.cs 파일로 저장한다). 이 클래스는 아래의 메소드를 추가로 포함한다. (20%)
– public float GetNormalWeight();  // Person의 표준체중 (Ex1과 동일)
– public BMI GetBMI();     // Person의 비만도 (Ex1과 동일)
– public float GetDailyCaloricIntake();    // Person의 하루권장섭취량
// 한국인 하루권장섭취량 남성 2600 kcal 여성 2100 kcal
// 기초대사량산출공식 (Herris Benedict Equation)
// 기초대사량(남성) = 66.47 + (13.75*weight) + (5*height) – (6.76*age)
// 기초대사량(여성) = 655.1 + (9.05*weight) + (1.85*height) – (4.68*age)
// 활동대사량 = 저활동적(1.3)/중간활동적(1.5)/활동적(1.75)
// 개인별 하루권장섭취량(kcal) = 기초대사량 * 활동대사량
– public override void Print();  // Person(베이스클래스)정보와 추가적으로
// 표준체중, 비만도, 하루권장섭취량을 출력
– public override string ToString()   // Print와 동일하게 string으로 출력

3. DailyCaloricIntakeCalculator 클래스의 Main 함수에서는 PersonDailyCaloricIntakeCalculator 객체를 5개 이상입력 받아서 array 또는 ArrayList pArray에 Add하고 난 후 pArray에 있는 모든 정보에 대해서 Print 출력한다. (20%)
http://msdn.microsoft.com/en-us/library/system.collections.arraylist(VS.71).aspx
– for 문을 사용하여 5명 이상 PersonDailyCaloricIntakeCalculator에 개인 정보를 입력받아서 추가한 후에
– 전체 배열에 있는 개인별 나이/신장/체중/성별/활동량 및 표준체중/비만도/하루권장섭취량을 출력한다. (foreach구문과 PersonDailyCaloricIntakeCalculator 클래스의 ToString() 을 사용할 것)

4. 프로그램에 본인이 더 테스트해보고 싶은 Method나 routine을 추가하라. (10%)

# Assignment 1

연습문제 (1)

□ 단원 : C# 기초
□ 목표 : C# 프로그램 기초
□ 주요 연습 내용 : Visual Studio 2010, C# 입출력, 연산자, 변수, 제어문 사용 연습

3542998201.hwp
연습문제 Ex1 (Due by 9/30 금 24시까지)
-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex1.zip으로 묶어서 낼 것. 보고서 (30%)

[연습문제]

0. Visual C# Console Application의 프로젝트를 생성한다.
1. BMI(Body Mass Index) 방식의 표준체중계산기 프로그램 StandardWeightCalculator 클래스를 작성하라. (30%)
– enum Gender { Female, Male };를 사용
– enum BMI { Underweight, Normal, Overweight, Obesity };를 사용
– void GetKeyboardInput() 함수는 키보드로 신장, 체중, 성별을 입력받아서 처리
+ 힌트: while 문을 사용하여 남/여 혹은 M/F가 아닌 경우 다시 입력을 받음
+ 힌트: Console.ReadLine() 함수는 string을 반환하므로, float로 변환하기 위하여
Parse 함수 사용 => floatValue = (float)double.Parse(string)
+ 힌트: TryParse 함수는 string을 double로 변환이 가능하면, out 매개변수로 변환된 값을 전달해 주고, true boolean 값을 반환 => boolValue = double.TryParse(string, out doubleValue)
– Gender GetGenderFromString(string str) 메소드는 Female/Male 중에 하나를 반환
– static float GetNormalWeight(float height, Gender gender) 메소드는 표준체중 값을 계산하여 반환
// 남자표준체중 = 신장(m) x 신장(m) x 22
// 여자표준체중 = 신장(m) x 신장(m) x 21
– BMI GetBMI(float height, float weight) 메소드는 Underweight /Normal/ Overweight/ Obesity 중에 하나를 반환
// BMI = 체중(kg)/신장^2(m^2)
// 20 미만 저체중 (Underweight)
// 20~24 정상 (Normal)
// 25~29 과체중 (Overweight)
// 30 이상 비만 (Obesity)
– void Print() 메소드는 개인의 표준체중과 비만도를 화면에 출력
2. Main 함수에서는 StandardWeightCalculator 객체를 생성하고 키보드 입력으로 키(cm), 몸무게(kg), 성별(남/녀)를 입력받아서, 표준체중, 비만도를 출력하는 routine 등을 추가한다. (20%)
– do..while 문을 사용하여 다른 사람을 하려면 다시 처음으로 돌아갈 수 있도록 함

3. Main 함수에서 본인이 더 테스트해보고 싶은 StandardWeightCalculator 클래스의 Method나 routine을 추가하라. (20%)
– 예를 들어, 복부비만=허리둘레(cm)/ 엉덩이둘레(cm) 결과 값이 0.7~0.8cm는 정상, 0.8~0.9cm는 위험, 0.9cm 이상은 심각