HW3

단국대학교 멀티미디어공학전공 HCI프로그래밍2 (2015년 가을학기) 실습

날짜: 2015년 10월 30일

 

– 실습번호 : lab-03 (Due by 11/17)

– 실습제목 : collections, class, FileIO, LINQ

– 실습요약 : 평면 도형의 점들 입력 값으로 도형 판별하기 및 영역과 둘레 계산하기 및 쿼리

– 준비자료 : https://www.mathsisfun.com/geometry/quadrilaterals-interactive.html

 

– 실습문제

public enum FigureType // FigureType 판별
{
Triangle,
EquilateralTriangle,
IsoscelesTriangle,
ScaleneTriangle,
Quadrilateral,
Square,
Rectangle,
Parallelogram,
Rhombus,
Trapezoid,
None
}

 

  1. Point 클래스를 작성한다.

+ public int X { get;  set; }

+ public int Y { get;  set; }

+ public static implicit operator System.Drawing.Point(Point p) {

Return new System.Drawing.Point(p.x, p.y);

}

 

  1. Figure 추상클래스를 상속 받아 Triangle, Quadrilateral 클래스를 작성한다.

public class FigureTypeResolver : JavaScriptTypeResolver // JSON serialization & deserialization
{
public override Type ResolveType(string id)
{
return Type.GetType(id);
}

public override string ResolveTypeId(Type type)
{
if (type == null)
{
throw new ArgumentNullException(“type”);
}

return type.FullName;
}
}

public class FigureBound // TopLeft Point(X,Y) & Width & Height
{
public int X
{
set;
get;
}

public int Y
{
set;
get;
}

public int Width
{
set;
get;
}

public int Height
{
set;
get;
}

public FigureBound() : this (0, 0, 10, 10)
{
}

public FigureBound(int x, int y, int width, int height)
{
Set(x, y, width, height);
}

public void Set(int x, int y, int width, int height)
{
this.X = x;
this.Y = y;
this.Width = width;
this.Height = height;
}
public override string ToString() { return (String.Format(“({0}, {1}, {2}, {3})”, X, Y, Width, Height)); } // ToString method override
}

public abstract class Figure // Figure 추상 클래스
{
public ConsoleColor Color
{
get;
set;
}

protected List<Point> vertices = null;
public List<Point> Vertices // Use Point.cs (Not System.Drawing.Point) for JSON
{
get
{
return vertices;
}
set
{
vertices = value;
UpdateBounds(); // 새 정점에 따른 바운딩박스 계산
UpdateSides(); // 새 정점에 따른 변들 계산
UpdateAngles(); // 새 정점에 따른 내각들 계산
}
}

public FigureBound Bounds = new FigureBound(); // 바운딩박스

public List<double> Sides // 변
{
get;
set;
}

public List<double> Angles // 내각 (radian)
{
get;
set;
}

public abstract void UpdateBounds();
public abstract void UpdateSides();
public abstract void UpdateAngles();

public void Draw(Graphics g) { // 도형 그리기

Brush b = new

SolidBrush(System.Drawing.Color.FromName(this.Color.ToString())));

System.Drawing.Point[] points = Array.ConvertAll(Vertices.ToArray(),

x => (System.Drawing.Point)x);

g.FillPolygon(b, points);

}

}

 

  1. FigureCalculator 클래스는 도형의 점들 입력 값으로부터 도형의 판별 및 도형의 면적과 둘레 계산을 담당한다.

+ public void GetUserInputFigure() // 사용자로부터 도형의 점을 입력 (3점과 4점만 입력 받도록 함) (optional)

+ public FigureType GetFigureType() // 무슨 도형인지 판별 (정삼각형, 이등변삼각형, 부등변삼각형 또는 정사각형, 직사각형, 평행사변형, 마름모, 사다리꼴 등)

+ public double Area(FigureType type, Figure figure) // 도형의 면적 계산

+ public double Perimeter(FigureType type, Figure figure) // 도형의 둘레 계산

 

  1. FigureManager 클래스는 File IO 입출력을 담당한다.

+ JSON을 이용한 파일 입출력 (JSON 형태로 저장한 도형의 리스트를 figureList에 import & 사용자가 추가로 입력한 도형의 정보를 포함하는 figureList를 파일로 export)

 

  1. FigureManager클래스 또는 Program 클래스의 Main 함수에서 본인이 더 테스트해보고 싶은 Method를 추가하라. 디렉토리에 여러 개의 데이터를 읽어서, 여러 가지 방법으로 정렬 및 LINQ 쿼리를 한 후 새로운 파일에 저장한다. 등등. 실행 화면과 코드를 첨부하시오.

+ List<Figure> figureList = new List<Figure>(); // 도형의 리스트

// LINQ를 이용하여 리스트에서 사다리꼴(Trapezoid)만 List로 추출

– public IList<Figure> GetTrapezoid () { // 내부구현 필요 – LINQ ToList() 사용 }

// LINQ를 이용하여 리스트에서 지정한 영역 값보다 작은 도형만 List로 추출

– public IList<Figure> GetFigureAreaLessThan(double area) { // 내부구현 필요 – LINQ ToList() 사용 }

 

HashCode

MSDN says:

A hash code is a numeric value that is used to identify an object during equality testing. It can also serve as an index for an object in a collection.

The GetHashCode method is suitable for use in hashing algorithms and data structures such as a hash table.

The default implementation of the GetHashCode method does not guarantee unique return values for different objects. Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value it returns will be the same between different versions of the .NET Framework. Consequently, the default implementation of this method must not be used as a unique object identifier for hashing purposes.

The GetHashCode method can be overridden by a derived type. Value types must override this method to provide a hash function that is appropriate for that type and to provide a useful distribution in a hash table. For uniqueness, the hash code must be based on the value of an instance field or property instead of a static field or property.

Objects used as a key in a Hashtable object must also override the GetHashCode method because those objects must generate their own hash code. If an object used as a key does not provide a useful implementation of GetHashCode, you can specify a hash code provider when the Hashtable object is constructed. Prior to the .NET Framework version 2.0, the hash code provider was based on the System.Collections.IHashCodeProvider interface. Starting with version 2.0, the hash code provider is based on the System.Collections.IEqualityComparer interface.

Basically, hash codes exist to make hashtables possible.
Two equal objects are guaranteed to have equal hashcodes.
Two unequal objects are not guaranteed to have unequal hashcodes (that’s called a collision).

CLASS INDEXER, PROPERTY, ABSTRACT, SEALED

Indexer (인덱서)
http://dis.dankook.ac.kr/lectures/hci09/entry/Indexer

Property (속성)
http://dis.dankook.ac.kr/lectures/hci09/entry/Property

Abstract Class (추상 클래스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Abstract-class

Sealed Class (봉인 클래스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Sealed-Class

polymorphism (다형성)
– Shape/Circle/Rectangle/Triangle/Square 클래스
– class 및 inheritance
– abstract class 및 polymorphism

ShapePolymorphism

Interface

Interface (인터페이스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Interface 

IEnumerable & IEnumerator Interface
-IEnumerable 인터페이스는 foreach를 사용하여 컬랙션을 반복하는 것을 지원하기 위해 구현하여 사용한다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IEnumerable
http://dis.dankook.ac.kr/lectures/hci09/entry/Enumerator

IEquatable Interface
-IEquatable 인터페이스는 두 객체간에 서로 내부 내용이 같은 지 (예: if(a == b))를 비교하기 위해 구현하여 사용한다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IEquatable
http://dis.dankook.ac.kr/lectures/hci10/72
http://dis.dankook.ac.kr/lectures/hci09/entry/Equals

IComparable Interface
-IComparable 인터페이스는 개체에 대한 기본 정렬(sort) 순서를 지정해주기 위해 구현하여 사용한다. 해당 개체를 배열이나 컬랙션에서 정렬하는데 필요하다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IComparable

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, 크면 양수를 반환하는 메소드