Category Archives: Homework

Assignment 4

연습문제 (4)


□ 단원 : C# WinForm
□ 목표 : C# WinForm 프로그래밍 Controls & GUI & GDI+ & Dialog
□ 주요 연습 내용 : Menu, Toolbar, ImageList, Custom Form, Graphics, Mouse, Print
□ 준비자료 : ObjectPopulation.zip


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


[연습문제]
0. Window Form 응용프로그램의 메인 폼의 Text를 “HCI2_Ex4_이름_학번”으로 바꾼다.


1. MainForm(Size는 540, 630)에 메뉴, 툴바, 탭컨트롤을 추가한다. (10%)


File 메뉴항목
 -New: 새로 그리기
 -Open/Save: 열기/저장하기
 -Print: 화면의 내용을 프린터로 출력하기
 -Close: 응용프로그램 종료
Data 메뉴항목
 -Add Data : 자료 추가
 -Edit Data : 자료 편집
 – Delete Data: 자료 삭제
View 메뉴항목
 -ListView: 리스트뷰로 보기
 -MapView: 맵뷰로 보기


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


탭컨트롤(Size는 510, 530)에 ListView와 PictureBox 컨트롤을 추가한다.
-첫 번째 TabPage에는 ListView (Size는 500, 500)을 추가하고, View는 Detail로 바꾼 후, Data를 보여줄 수 있도록 Column Header (Name/Mode/Position/Angle/Scale) 추가
-두 번째 TabPage에는 PictureBox (Size는 500, 500)을 추가하고, Initial Image로 Image에 Resources 디렉토리 안에 있는 “map.jpg”를 추가사용자 삽입 이미지


2. 모달형 대화상자 (Modal Dialog)인 ObjectDataForm을 새로 추가하고 ObjectForm과 연동한다. (10%)


ObjectDataForm 대화상자
-ObjectData 개체의 “이름”을 위한 “텍스트박스”
-ObjectData 개체의 “이미지 개체 불러오기”를 위한 “버튼”
-ObjectData 개체의 “X”, “Y” 위치 값을 위한 “텍스트박스”
-ObjectData 개체의 “각도” 값을 위한 “NumericUpDown”
-ObjectData 개체의 크기조절 “배율” 값을 위한 “라디오버튼” 4개 (그 중에 100%는 Checked)
-ObjectData 개체의 OK “버튼” (DialogResult 속성에 OK)
-ObjectData 개체의 CANCEL “버튼” (DialogResult 속성에 Cancel)


사용자 삽입 이미지
모달리스형 대화상자(Modeless Dialog)인 ObjectForm와 ObjectDataForm간에 연동
-ObjectDataForm에서 “개체 불러오기” 버튼을 누르면, ObjectForm이 나타나도록 ObjectDataForm의“개체 불러오기” 버튼의 [Click] 이벤트 처리기를 작성한다.


사용자 삽입 이미지
-ObjectForm의 리스트뷰에 있는 개체 (예, 파란꽃, 분홍꽃, 빨간꽃, 하얀꽃, 나무, 나비, 구름, 태양) 중에 하나를 선택하면, ObjectForm은 닫히고 그 개체의 이름이 ObjectDataForm의 “개체 불러오기” 버튼에 이름으로 나타나도록, ObjectForm의 listView에 [SelectedIndexChanged] 이벤트 처리기를 작성한다. (힌트: ObjectForm의 listView에 FocusedItem의 Text를 ObjectDataForm의 “개체 불러오기” 버튼 Text로 대입)


사용자 삽입 이미지
3. 데이터를 추가, 편집, 삭제, 전체 삭제하는 이벤트 처리기를 추가한다. (20점)
-MainForm에서 ObjectData data을 리스트로 저장하는 List<ObjectData> pList = new List<ObjectData>()를 사용
-MainForm의 메뉴항목과 툴바에서 “Add Data”를 선택하면, ObjectDataForm이 나타나서 데이터를 채운 후 OK 버튼을 누르면, MainForm의 Listview와 Mapview에 새로운 데이터가 추가되는, MainForm의 메뉴와 툴바“Add Data”에 [Click] 이벤트 처리기를 작성한다. (힌트: 새로운 ObjectData 생성 후, pList 데이터 추가, listView 데이터 추가, pictureBox 무효화)사용자 삽입 이미지
-MainForm의 메뉴항목과 툴바에서 “Edit Data”를 선택 또는 MainForm의 Listview에서 항목을 선택하면, 그 선택한 항목에 대한 데이터를 받아서 ObjectDataForm에 나타나도록 하기 위하여, ObjectDataForm에 [Load] 이벤트 처리기를 작성한다.
(힌트: 선택한 항목 index를 받아서, pList[index]에서 정보를 받아와서, ObjectDataForm에 이름, 모델, X,Y 위치, 각도, 배율에 값을 지정)
-MainForm의 메뉴항목과 툴바에서 “Edit Data”를 선택하여 ObjectDataForm이 나타나서, 데이터를 수정한 후 OK 버튼을 누르면, MainForm의 Listview와 Mapview에 데이터가 수정되는, MainForm의 메뉴와 툴바“Edit Data”에 [Click] 이벤트 처리기를 작성한다.
(힌트: ObjectData 수정 후, pList 데이터 수정, listView 데이터 수정, pictureBox 무효화)
-MainForm의 메뉴항목과 툴바에서 “(현재 선택된 개체에 대한) Delete Data”를 선택하면, MainForm의 Listview와 Mapview에 데이터가 삭제되는, MainForm의메뉴와 툴바“Delete Data”에 [Click] 이벤트 처리기를 작성한다.
(힌트: pList에서 데이터 삭제, listView 데이터 항목 삭제, pictureBox 무효화)
-MainForm의 메뉴항목과 툴바에서 “New”를 선택하면, MainForm의 Listview와 Mapview에 데이터가 모두 삭제되는, MainForm의 메뉴와 툴바 “New”에 [Click] 이벤트 처리기를 작성한다.(힌트: pList에서 모든 데이터 삭제, listView 모든 데이터 항목 삭제, pictureBox 무효화)


4. MainForm 클래스에 ObjectData를 csv 텍스트로 저장(Save), 열기(Open)를 구현한다. (20점)
-openFileDialog/saveFileDialog 사용
-MainForm의 메뉴항목과 툴바에서 “Open” 또는 “Save”를 선택하면, openFileDialog 또는 saveFileDialog에서 선택한 파일이름을 사용하여, csv 텍스트 데이터를 읽어 들여서 pList에 넣고 리스트뷰와 맵뷰에 업데이트하기 또는 pList에 데이터를 csv 텍스트로 저장하기 위한 [Click] 이벤트 처리기를 작성한다. (힌트: 데이터를 읽어들인 후, listView 모든 데이터 항목 업데이트, pictureBox 무효화)
-ObjectData 클래스에 Serialization/Deserialization 할 수 있도록 기본 직렬화를 구현하고, BinaryFormatter를 사용하여 pList 데이터를 Serialize 또는 Deserialize 하여 리스트뷰와 맵뷰에 업데이트하는, MainForm의 메뉴와 툴바 “Open” 또는 “Save”에 [Click] 이벤트 처리기를 작성한다. (extra 10%)


5. MainForm의 리스트뷰/맵뷰 Menu와 Toolbar와 Tab 컨트롤 연동시키고, 출력 (Print), 닫기 (Close) 나머지 기능을 추가한다. (10점)
-printDocument & printDialog 사용하여 출력을 구현한다.
-MainForm의 메뉴항목에서 “Listview”를 선택하면, Tab 컨트롤의 페이지를 리스트뷰로 바꾸고 Toolbar의 콤보박스에서도 리스트뷰가 나타나도록, MainForm메뉴의“Listview”에 [Click] 이벤트 처리기를 작성한다.
-MainForm의 메뉴항목에서 “Mapview”를 선택하면, Tab 컨트롤의 페이지를 맵뷰로 바꾸고 Toolbar의 콤보박스에서도 맵뷰가 나타나도록, MainForm메뉴의“Mapview”에 [Click] 이벤트 처리기를 작성한다.
-MainForm의 툴바 콤보박스에서 “Listview/Mapview”를 선택하면, Tab 컨트롤의 페이지를 리스트뷰/맵뷰로 바꾸고 메뉴 항목에서도 리스트뷰/맵뷰가 Checked 되도록, MainForm툴바의“ComboBox”에 [SelectedIndexChanged] 이벤트 처리기를 작성한다.
-MainForm의 Tab 컨트롤 페이지를 “Listview/Mapview”로 선택하면, 툴바의 콤보박스에서도 리스트뷰/맵뷰로 바뀌고 메뉴 항목에서도 리스트뷰/맵뷰가 Checked 되도록, MainForm탭컨트롤에 [SelectedIndexChanged] 이벤트 처리기를 작성한다.


6. 본인이 원하는 열 개 이상의 ObjectData를 배치해보고, 본인이 원하는 기능을 더 추가한다. 그 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)

Assignment3

연습문제 (3)






□ 단원 : C# 기초


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


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


□ 준비자료 : 지진데이터


8900963879.hwp4018427041.zip


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


-cyber 강의(cyber.dku.edu)로 source code, executable file, solution/project VC# file,

보고서를 학번_이름_Ex3.zip으로 묶어서 낼 것. 보고서 (30%)



[연습문제]


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


다음 데이터 멤버 필드를 포함한다.


– private int year, month, day;


– private double time;


– private double lat, lon;


– private double magnitude, depth;


그리고 각 멤버 필드에 대한 속성(Property)를 지정하여 외부에서 사용할 수 있도록 한다.


– public int Year { get; set;}// get과 set에 대한 내부구현 필요


– public int Month { get; set;}


– public int Day { get; set;}


– public double Time { get; set;}


– public double Lat { get; set;}


– public double Lon { get; set;}


– public double Magnitude { get; set;}


– public double Depth { get; set;}


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


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


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


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


 


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


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


– public bool Equals(QuakeData other){ // == 내부구현 필요 }


 


 


3. QuakeDataComparer.cs 파일에는 IComparer<QuakeData> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다. QuakeDataManager 클래스의 Sort 메소드에서 사용됨. (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) // 내부구현 필요 }


 


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


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


QuakeSortMode 열거형을 정의한다.


enum QuakeSortMode { Year, Month, Day, Time, Lat, Lon, Magnitude, Depth}


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


– private List<QuakeData> pList = new List<QuakeData>();


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


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


// StreamReader 사용


– public void Import(string filename) { // 내부구현 필요 }


// pList의 모든 원소를 cvs(comma separated value) 텍스트로 저장


// StreamWriter 사용


– public void Export() { // 내부구현 필요 }


 


// 선택한 모드에 따라서 리스트의 데이터를 Year, Month, Day, Time, Lat, Lon, Magnitude, Depth 순서로 정렬


// QuakeMonthComparer, QuakeDataComparer, QuakeTimeComparer 등을 사용


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


 


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


// pList.ForEach에 각각의 Print를 출력하는 Action delegate 사용


– public void Print() { pList.ForEach(Print); }


– private void Print(QuakeData q) { Console.WriteLine(q); }


 


5. QuakeDataManger클래스 또는 Program 클래스의 Main 함수에서 본인이 더 테스트해보고 싶은 Method를 추가하라. (20%)


// 리스트에서 강도가 몇 이상인 조건을 만족하는 새 리스트 List<QuakeData> 반환


// pList.FindAll에 IsMagnitudeGreater를 호출하는 Predicate delegate 사용


// IsMagnitudeGreater 안에서는 사용자가 지정한 mag값보다 클 경우 true반환


– public List<QuakeData> GetQuakeListByMagnitude(double mag)


– private bool IsMagnitudeGreater(QuakeData q)


 


// 리스트에서 지정한 영역에 속한 데이터만 뽑아 새 리스트 List<QuakeData> 반환


// pList.FindAll에 InRange안에 있는지 알려주는 Predicate delegate 사용


// InRange 안에서는 사용자가 지정한 lat1, lon1, lat2, lon2 안에 있을 경우 true반환


– public List<QuakeData> GetQuakeListByRange(double lat1, double lon1, double lat2, double lon2)


– private bool InRange(QuakeData q)


 

Assignment 2

연습문제 (2)


□ 단원 : C# 기초
□ 목표 : C# 프로그램 기초
□ 주요 연습 내용 : array, foreach, class, recursive call 사용 연습
□ 준비자료 : TicTacToe.cs1743820900.hwp


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


[연습문제]
0. 3목 (Tic-Tac-Toe) 게임 프로그램을 작성하라. 3목 게임은 게임판의 지정된 행/열에 사람은 ‘X’ 수를 두고 컴퓨터는 ‘O’ 수를 번갈아 둔다. 행, 열, 대각선으로 3개의 ‘X’나 ‘O’가 존재하면 승자가 된다.


1. Board 클래스에는 보드를 표현하는 2차원 배열 matrix가 데이터 멤버로 포함되어야 한다. (50%)
– char[,] matrix;
– Board() 기본 생성자
– void InitBoard() 메소드는 matrix 보드에 값을 ‘ ‘으로 초기화
– bool IsFullBoard() 메소드는 matrix 보드에 빈값이 없으면 true를 반환
– bool IsEmpty(int i, int j) 메소드는 matrix 보드 (i,j) 위치에 빈값이 있으면 true 반환 – void Mark(int i, int j, char c) 메소드는 matrix 보드 (i,j) 위치에 ‘X’ 또는 ’O’를 표시
– void Unmark(int i, int j) 메소드는 matrix 보드 (i,j) 위치에 ‘ ‘로 표시
– char GetMarked(int i, int j) 메소드는 matrix 보드 (i,j) 위치에 있는 값을 반환
– char CheckThree() 메소드는 matrix 보드에 행, 열, 대각선으로 3개가 되는 것이 있는지 확인하고 어느 것인지를 반환. 만약 전체가 3개로 된 것이 없이 보드가 차면 ‘T’ 반환
– void DisplayBoard() 메소드는 matrix 보드를 화면에 표시
– void MoveByKeyboard(char c) 메소드는 화면에서 키보드 사용자의 입력을 받아서 원하는 matrix 보드 (i,j) 위치에 ‘X’ 또는 ’O’ 표시
– void MoveSimple(char c) 메소드는 matrix 보드에서 빈칸이 있으면 ‘X’ 또는 ’O’ 표시


2. Main 메소드에서는 게임 행동을 지정한다. (10%)
– 보드를 초기화한다.
– while 문을 사용하여 게임이 종료되기 전까지 ‘X’나 ‘O’ 수를 번갈아 두게 한다.
  이때 사람은 MoveByKeyboard(‘X’) 키보드 사용자 입력을 받아서 ‘X’ 수를 둔다.
  컴퓨터는 MoveSimple(‘O’) 보드의 빈칸 위치에 ‘O’ 수를 둔다.
– 만약 승자가 결정되었으면 누구인지 화면에 출력한다.
– 수를 둘 때마다 게임판을 화면에 출력한다.


3. Board 클래스에 MoveBest(int depth, char c) 메소드는 컴퓨터가 사람이 둔 수를 보고 Minimax 알고리즘 또는 Alpha Beta Pruning 알고리즘을 사용하여 최상의 조건에 ‘O’를 표시하는 이 메소드를 추가하라. 그리고 Main에서 MoveSimple 대신 MoveBest를 사용하여 테스트해본다. (10%)
http://en.wikipedia.org/wiki/Minimax
http://en.wikipedia.org/wiki/Alpha-beta_pruning


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

Assignment 1

연습문제 (1)


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


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


[연습문제]
1. 가위바위보 게임 프로그램 ScissorRockPaper 클래스를 작성하라. 이름(name)과 이긴 숫자(numWin)를 가진 게임 플레이어(Player) 구조체를 사용한다.  (30%)
– public enum Game { 가위=1, 바위=2, 보=3 };를 사용
– static Game GetRandomHand() 함수는 1,2,3 중 하나의 난수를 발생하여 enum type인 Game 값을 반환
  + 힌트: Random 클래스를 사용하여 1,2,3 중 하나의 난수를 발생시킴
– static Game GetHandByKeyboard() 함수는 키보드로 1(가위),2(바위),3(보)를 받아서 처리하여 enum type인 Game 값을 반환
  + 가위바위보 입력은 1,2,3 integer 값만을 입력받도록 해야 함
  + 힌트: while 문을 사용하여 1,2,3 integer가 아닌 경우 다시 입력을 받음
  + 힌트: Console.ReadLine() 함수는 string을 반환하므로, int로 변환하기 위하여  
      Parse 함수 사용 => intValue = int.Parse(string)
  + 힌트: TryParse 함수는 string을 integer로 변환이 가능하면, out 매개변수로 변환된
      값을 전달해 주고, true boolean 값을 반환  => boolValue = int.TryParse(string,
      out intValue)
– static void PrintWinner(Player player1, Player player2) 함수는 삼세판 가위바위보 게임하고 난 뒤 최종으로 승리한 사람이 누구인지 화면에 출력
  + 힌트: Player 구조체의 numWin이 더 큰 수를 가진 사람이 게임을 이긴다.


2. Main 함수에서는 2명의 게임 플레이어 객체를 생성하고 (1명은 컴퓨터이고, 다른 1명은 본인이 키보드로 입력함), 가위바위보 게임을 진행하는 routine을 추가한다. (20%)
– 힌트: GetHandByKeyboard와 GetRandomHand로 나온 바위>가위>보>바위를 판단함
– 힌트: do..while 문을 사용하여 만약 둘이 비긴 경우 계속 입력을 받도록 함
– 힌트: for 문을 사용하여 삼세판 가위바위보 게임을 진행함
– 힌트: 한 게임마다 이겼을 경우 Player 구조체의 numWin을 증가시킴


3. Main 함수에서 본인이 더 테스트해보고 싶은 ScissorRockPaper 클래스의 Method나 routine을 추가하라. (20%)