Category Archives: Homework

Assignment 6

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


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


1. 생성된 폼 Form1.cs [Design]에서 Toolbox(도구상자)에서 메뉴와 툴바를 추가한다. (20%)


File 메뉴항목
 -New: 새로운 그림판 그리기
 -Open/Save: 그림판 열기/저장하기
 -Print: 화면을 프린터로 출력하기
 -Exit: 응용프로그램 종료


Shape 메뉴항목
 -Line/Ellipse/Rectangle/Triangle: 선,타원,사각형,삼각형 펜으로 그리기
 -FillEllipse/FillRectangle/FillTriangle: 타원,사각형,삼각형 단색으로 채우기
 -HatchEllipse/HatchRectangle/HatchTriangle: 타원,사각형,삼각형 해치스타일로 채우기
 -TextureEllipse/TextureRectangle/TextureTriangle: 타원,사각형,삼각형 비트맵으로 채우기


Design 메뉴항목
 -Color: ForeColor/BackColor 선택하는 대화상자
 -Pen: BrushWidth/DashStyle 선택하는 대화상자
 -Brush:  HatchStyle(Horizontal/Vertical/Backward Diagonal/Cross/Diagonal Cross 등)와 텍스쳐를 선택하는 대화상자


툴바에 메뉴 항목과 동일한 내용을 추가한다.
-New/Open/Save/Print 메뉴항목 => New/Open/Save/Print 툴바 버튼
-Shape 메뉴 항목=> Tool(Line/Ellipse/Rectangle/Triangle)과 Draw(Outline/Solid Fill/Hatch Fill/Texture Fill) DropDownButton로 추가
-Color 메뉴 항목 => Color 툴바 버튼
-Pen 메뉴항목 => Brush width와 Dash style 콤보박스로 추가
-Brush 메뉴항목 =>Hatch style 콤보박스로 추가


2. Color, Pen, Brush 속성 정의를 위하여 사용자 정의 폼과 컨트롤을 추가한다. (20%)
-Color 대화상자(Modeless Dialog):
현재 도형의 foreColor 와 backColor를 선택할 수 있도록 한다.
-Pen 대화상자(Modeless Dialog):
현재 선/타원/사각형/삼각형 도형의 선의 두께와 Dash style을 선택할 수 있도록 한다.
-Brush 대화상자(Modeless Dialog):
현재 HatchBrush/TextureBrush의 Hatch style과 Image를 선택할 수 있도록 한다.사용자 삽입 이미지
사용자 삽입 이미지

사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

3. Rubber-band Line, Rectangle, Ellipse, Triangle 도형을 그려주는 루틴을 추가한다. (30%)
-Graphics 클래스의 DrawLine/DrawEllipse/DrawRectangle/DrawPolygon 메소드에 Pen 속성을 사용하여 선, 타원, 사각형, 삼각형을 그린다.
-Graphics 클래스의 FillEllipse/FillRectangle/FillPolygon 메소드에 SolidBrush/HatchBrush/TextureBrush를 사용하여 타원, 사각형, 삼각형을 그린다.


-MainForm에서 DrawInfo shape을 리스트로 저장하는 ArrayList shapeList = new ArrayList()를 사용
-메뉴의 New 항목을 선택했을 때, 그림과 shapeList를 지우고 초기화
-Load 이벤트 핸들러, 배경화면 이미지를 흰색으로 초기화
-MouseDown 이벤트 핸들러에서는, 왼쪽 마우스를 누르면 새로운 도형을 생성
-MouseMove 이벤트 핸들러에서는, 왼쪽 마우스가 눌린 상태에서 움직이면 화면 업데이트
-MouseUp 이벤트 핸들러에서는, 마우스를 놓으면 새로운 도형이 생성되고 리스트에 추가
-Paint 이벤트 핸들러에서는, 현재 그리는 도형을 최종적으로 그림
-SizeChanged 이벤트 핸들러, 배경화면 이미지의 크기를 조정


4. 그림판의 출력(Print), 저장(Save), 열기(Open) 등 본인이 원하는 기능을 더 추가한다. (extra 10%)
-printDocument & printDialog 사용
-openFileDialog/saveFileDialog & DrawInfo 클래스의 ToString() 사용


5. 본인이 원하는 열 개 이상의 도형을 그려보고, 그 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)
사용자 삽입 이미지

Number Only Textbox

// number only textbox using TryParse
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    int value = 0;
    e.Handled = !int.TryParse(e.KeyChar.ToString(), out value);
}

// number only textbox using Regex.IsMatch
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), “\\d+”))
        e.Handled = true;
}

Assignment5

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


[연습문제]
1. PersonRecord라는 Window Form 응용프로그램 프로젝트를 생성한다.


2. 생성된 폼 Form1.cs [Design]에서 Toolbox(도구상자)에서 Controls (컨트롤)을 가져와 출력화면을 위한 폼을 디자인한다. (10%)
-리스트 출력을 위한 ListView는 속성 (Property) 창에서 View를 Details로 바꾼다.
-편집 컨트롤 그룹을 위한 Group Box
-사람정보 (이름, ID, 전화번호, 주소) 입력을 위한 TextBox. 그리고 ID는 숫자만 입력할 수 있도록 한다.
-등록, 수정, 삭제, 모두 삭제를 위한 Button
-파일 열기, 파일 저장, 응용프로그램 끝내기 ToolStrip (또는 Button 사용)
-OpenFileDialog와 SaveFileDialog 공용컨트롤 등등사용자 삽입 이미지



3. Person.cs 클래스는 다음 메소드를 가진다. (10%)
– public override string ToString() // “이름,ID,전화번호,주소”로 출력 (CSV 파일 출력에 필요)
– public int CompareTo(Person other) // Person의 이름 순서대로 비교 (Sort에 필요)
– public bool Equals(Person other)        // 이름과 같은지 비교 (Find에 필요)
– public ListViewItem ToListViewItem() // 리스트뷰 항목을 생성 (ListView 컨트롤에 필요) 메소드를 추가한다.


4. Form1.cs 클래스에 List<Person>을 데이터 멤버로 포함시키고, 파일열기, 파일저장, 추가, 수정, 삭제, 모두 삭제  버튼을 이용하여 사람 정보를 ListView에 새로운 항목으로 추가하거나, 선택된 항목의 수정 및 삭제 등이 가능하도록 이벤트 핸들러를 작성한다. (30%)


멤버 필드:
-private List<Person> pList;
-public Form1()
{
 InitializeComponent();
 pList = new List<Person>();
}


툴바 이벤트 핸들러:
     // 파일을 읽어 리스트와 리스트뷰에 Person 추가
     -private void loadFileButton_Click(object sender, EventArgs e)
     // 리스트에 있는 모든 Person을 파일로 저장
     -private void saveFileButton_Click(object sender, EventArgs e)
     // 응용프로그램 종료
     -private void closeButton_Click(object sender, EventArgs e)


– 텍스트파일은 CSV 포맷 (예: Test.csv를 사용하여 테스트해 볼 것)
김승훈, 1202, 041-550-3481, 3과420
박태근, 1204, 041-550-3486, 3과419
김대원, 1204, 041-550-3487, 3과418
박경신, 1207, 041-550-3469, 3과417
서병문, 1207, 041-550-3471, 3과407
정재진, 1209, 041-550-3482, 3과409
김태완, 1207, 041-550-3512, 학생회관
김명숙, 1207, 041-550-3511, 3과511


버튼 이벤트 핸들러:
     // pList와 ListView1에 Person 항목 추가 (Person의 ToListViewItem() 사용할 것)
     -private void addButton_Click(object sender, EventArgs e)
     // pList와 ListView1에서 현재 선택된 Person 정보 수정
     -private void editFileButton_Click(object sender, EventArgs e)
     // pList와 ListView1에서 현재 선택된 Person 항목 삭제
     -private void deleteButton_Click(object sender, EventArgs e)
     // pList와 ListView1에서 모든 Person 항목 삭제
     -private void deleteallButton_Click(object sender, EventArgs e)


리스트뷰 이벤트 핸들러:
     // 리스트뷰에서 현재 선택된 항목을 사람 정보(이름/ID/전화번호/주소) TextBox에 출력
     -private void listView1_ItemSelectionChanged(object sender,
                                             ListViewItemSelectionChangedEventArgs e)
     // 리스트뷰에서 현재 선택된 항목에 Person을 삭제
     -private void listView1_DoubleClick(object sender, EventArgs e)

4. 생성한 폼을 이용하여 구현한 모든 메소드를 테스트한 결과를 스냅샷으로 찍어서 보고서에 제출한다. (10%)
– 파일 열기로 데이터를 읽어들여 리스트에 로딩
– 추가, 수정, 삭제, 모두삭제를 사용하여 5명 이상 Person 추가 또는 제거
– 리스트뷰의 항목을 선택(ItemSelectionChanged), 항목을 더블클릭(DoubleClick), 헤더의 칼럼을 클릭(ColumnClick)하는 기능 테스트
– 파일 저장을 사용하여 리스트에 있는 모든 데이터를 저장 (리스트뷰에 있는 정보와 저장한 파일의 정보가 동일한지 스냅샷으로 찍어서 비교해줄 것)
– 응용프로그램 종료


5. Person 또는 Form1에서 본인이 더 테스트해보고 싶은 Method를 추가하라. 예를 들어 리스트뷰의 칼럼을 클릭하면 그 순서대로 전체 항목을 정렬하는 것 등등. (10%)


         http://msdn.microsoft.com/ko-kr/library/ms229643(VS.80).aspx
     // 리스트뷰의 헤더(이름/ID 칼럼)을 클릭하면 그 순서대로 전체 항목 Sort (정렬)
     -private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)

ArrayList

ArrayList예제 참고자료: http://dotnetperls.com/arraylist

ArrayList pArray = new ArrayList();
pArray.Add(person1);
pArray.Add(student1);
pArray.Add(faculty1);


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

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


 


// pArray의 원소를 Object형으로 받아서 처리할 경우 아래와같이 함
foreach (Object pt in pArray)
{
   if (pt is Person)
   {
      ((Person)pt).Print();
   }
   if (pt is Student)
   {
      ((Student)pt).Print();
   }
   if (pt is Faculty)
   {
      ((Faculty)pt).Print();
   }
}


// 아래와 같이 pArray 원소를 Person형으로 받아서 처리할 경우 pt.Print()만 호출하면
// 복잡한 형변환 과정이 필요없이 객체 형에 따라서 재정의된 메소드가 자동호출
foreach (Person pt in pArray)
{
    pt.Print();
}

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

TryParse

while (true) //국어 점수를 받는 반복문
{
      Console.Write(“국어 점수를 입력하세요(0~100) : “);
      string str = Console.ReadLine();

      value = int.TryParse(str, out s.kor);
      if (value == false || s.kor < 0 || s.kor > 100) {
              Console.WriteLine(“범위에 벗어난 점수를 입력하셨습니다”);
              continue;
      }
      else {
              Console.WriteLine(“국어성적 : {0}”, s.kor);
              break;
      }
}


HW1에서 국어,영어,수학을 입력받는 부분에서 위의 유형이 가장 대표적이였다.
그러나 while을 사용하여 아래의 코드와 같이 간단히 구현할 수 있다.



int value;  // needed for TryParse
string str; // needed for ReadLine


Console.Write(“국어성적을 입력하세요(0-100): “);
str = Console.ReadLine();
while ((!int.TryParse(str, out value))||(value<0 || value>100))
{
       Console.Write(“다시 국어성적을 입력하세요 (0-100): “);
       str = Console.ReadLine();
}
s.kor = int.Parse(str);

Generic List Class

<<List<T> 컬랙션 클래스의 메소드>>

public List<TOutput> ConvertAll<TOutput> (Converter<T, TOutput> converter)
-리스트 객체의 각 원소를 TOutput 형으로 변환하여 리스트로 반환

public bool Exists(Predicate<T> match)
-리스트에 있는 모든 원소 중 match 조건을 만족하는 원소가 있는지 여부를 반환

public T Find(Predicate<T> match)
-리스트에 있는 모든 원소 중 match 조건을 만족하는 첫번째 원소를 반환

public List<T> FindAll(Predicate<T> match)
-리스트에 있는 모든 원소 중 match 조건을 만족하는 모든 원소를 리스트로 반환

public int FindIndex(Predicate<T> match)
-리스트에 있는 모든 원소 중 match 조건을 만족하는 첫번째 원소의 인덱스를 반환

public int FindLastIndex(Predicate<T> match)
-리스트에 있는 모든 원소 중 match 조건을 만족하는 마지막 원소의 인덱스를 반환

public void ForEach(Action<T> action)
-리스트에 있는 모든 원소에 대해 action을 수행

public bool TrueForAll(Predicate<T> match)
-리스트에 있는 모든 원소가 match 조건을 만족하는 지 여부를 반환

<<대리자(Delegate)>>

public delegate void Action<T>(T object)
-T 형의 매개변수를 하나 받고 반환값이 없는 메소드

public delegate TOutput Converter<TInput, TOutput>(TInput input)
-TInput 형의 매개변수를 받고 이를 TOutput 형으로 변환하여 반환하는 메소드

public delegate bool Predicate<T>(T object)
-T 형의 매개변수를 받아 그것이 특정 조건을 만족하는지를 반환하는 메소드

public delegate int Comparison<T>(T x, T y)
-x, y 두 객체를 비교하는 메소드로 x가 y보다 작으면 음수, 같으면 0, 크면 양수를 반환하는 메소드