HW1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AreaCalculator
{
enum Figure { Triangle, Square, Rectangle, Parallelogram, Rhombus, Trapezoid, Circle }

class AreaCalculator
{
Figure? inputFigure = null;
double b = 1.0; // base/width
double h = 1.0; // height
double t = 1.0; // top
double r = 1.0; // radius/side
ConsoleColor[] colors = (ConsoleColor[])ConsoleColor.GetValues(typeof(ConsoleColor)); // ConsoleColor 배열

// CalculateArea 메소드는 실제 도형의 넓이 계산
double CalculateArea(Figure type) // if/elseif 또는 switch 구문
{
switch (type)
{
case Figure.Triangle:
return b * h * 0.5; // base * height * 0.5
case Figure.Square:
return r * r; // side * side
case Figure.Rectangle:
return b * h; // width * height
case Figure.Parallelogram:
return b * h; // base * height
case Figure.Rhombus:
return b * h * 0.5; // diagonal1 * diagonal2 * 0.5
case Figure.Trapezoid:
return (b + t ) * h * 0.5; // (base + top) * height * 0.5
case Figure.Circle:
return r * r * Math.PI; // PI * radius * radius
default:
return 0.0;
}
}

// GetAreaFormula 메소드는 출력시 사용
string GetAreaFormula(Figure type) // if/elseif 또는 switch 구문
{
switch (type)
{
case Figure.Triangle:
return b + ” x ” + h + ” x 0.5″;
case Figure.Square:
return r + ” x ” + r;
case Figure.Rectangle:
return b + ” x ” + h;
case Figure.Parallelogram:
return b + ” x ” + h ;
case Figure.Rhombus:
return b + ” x ” + h + ” x 0.5″;
case Figure.Trapezoid:
return “(” + b + ” + ” + t + “) x ” + h + ” x 0.5″;
case Figure.Circle:
return “3.14 x ” + r + ” ^2″;
default:
return “”;
}
}

// GetFigureFromName 메소드는 사용자 입력으로부터 Figure 반환
Figure? GetFigureFromName(string name) // if/elseif 또는 switch 구문
{
switch (name)
{
case “삼각형”:
case “Triangle”:
case “TRIANGLE”:
return Figure.Triangle;
case “정사각형”:
case “Square”:
case “SQUARE”:
return Figure.Square;
case “직사각형”:
case “Rectangle”:
case “RECTANGLE”:
return Figure.Rectangle;
case “평행사변형”:
case “Parallelogram”:
case “PARALLELOGRAM”:
return Figure.Parallelogram;
case “마름모꼴”:
case “Rhombus”:
case “RHOMBUS”:
return Figure.Rhombus;
case “사다리꼴”:
case “Trapezoid”:
case “TRAPEZOID”:
return Figure.Trapezoid;
case “원”:
case “Circle”:
case “CIRCLE”:
return Figure.Circle;
default:
return null;
}
}

// GetFigureColor 메소드는 각도형별 ConsoleColor 값
ConsoleColor GetFigureColor(Figure poly)
{
return colors[(int)poly+1]; // colors[0]은 검정색 바탕에서는 안보임
}

// GetValueFromInput 메소드는 각도형별 추가적인 입력 값
double GetValueFromInput(string input)
{
double value = 0.0;
Console.Write(“{0} 길이: “, input);  // input 인자 출력
while (!double.TryParse(Console.ReadLine(), out value))
{
Console.WriteLine(“잘못된 입력입니다. 다시 입력해주세요.”);
Console.Write(“{0} 길이: “, input);  // input 인자 출력
}
return value;
}

// 도형(Figure) 입력
Figure? GetInputFigure()
{
Figure? input = null;
do
{
Console.Write(“도형의 종류를 입력해주세요(삼각형/정사각형/직사각형 등등 또는 Triangle/Square/Rectangle): “);
if (input == null)  Console.WriteLine(“잘못된 입력입니다.”);
} while (input == null);
return input;
}

// GetKeyboardInput 메소드는 사용자 입력
public void GetKeyboardInput()
{
// 도형 입력
inputFigure = GetInputFigure();

// 도형에 따른 추가입력
if (inputFigure == Figure.Triangle)
{
this.b = GetValueFromInput(“삼각형 밑변(Base)”);
this.h = GetValueFromInput(“삼각형 높이(Height)”);
}
else if (inputFigure == Figure.Square)
{
this.r = GetValueFromInput(“정사각형 한변(Side)”); // use r (side)
}
else if (inputFigure == Figure.Rectangle)
{
this.b = GetValueFromInput(“직사각형 가로(Width)”);
this.h = GetValueFromInput(“직사각형 세로(Height)”);
}
else if (inputFigure == Figure.Parallelogram)
{
this.b = GetValueFromInput(“평행사변형 밑변(Base)”);
this.h = GetValueFromInput(“평행사변형 높이(Height)”);
}
else if (inputFigure == Figure.Rhombus)
{
this.b = GetValueFromInput(“마름모꼴 대각선길이(Width)”);
this.h = GetValueFromInput(“마름모꼴 대각선높이(Height)”);
}
else if (inputFigure == Figure.Trapezoid)
{
this.t = GetValueFromInput(“사다리꼴 윗변(Top)”);
this.b = GetValueFromInput(“사다리꼴 아래변(Base)”);
this.h = GetValueFromInput(“사다리꼴 높이(Height)”);
}
else if (inputFigure == Figure.Circle)
{
this.r = GetValueFromInput(“원 반지름(Radius)”);
}
}

public void Print()
{
Figure poly = inputFigure ?? default(Figure);
string formula = GetAreaFormula(poly);
double area = CalculateArea(poly);
Console.ForegroundColor = GetFigureColor(poly);
Console.WriteLine(“{0} 도형의 넓이는 {1} = {2:F1} 입니다.”, poly, formula, area);
Console.ForegroundColor = ConsoleColor.White;
}

public void PrintAllFigureArea()
{
foreach (Figure poly in Figure.GetValues(typeof(Figure))) // 각 도형마다
{
Console.WriteLine();
Console.ForegroundColor = GetFigureColor(poly); // 각 도형의 색깔
Console.WriteLine(“\t {0}”, poly); // 각 도형의 이름 출력

// 표 가로 상단
Console.Write(“{0,6}”, ” “);
for (int k = 1; k <= 10; k++)
{
Console.Write(“{0,6}”, k);
}
Console.WriteLine();
// 표 본문
for (int i = 1; i <= 10; i++)
{
Console.Write(“{0,6}”, i); // 표 세로
this.b = this.r = i;
for (int j = 1; j <= 10; j++)  // 각 도형 별 Area 값
{
this.h = j;
if (poly == Figure.Triangle || poly == Figure.Rectangle || poly == Figure.Parallelogram || poly == Figure.Rhombus)
{
Console.Write(“{0,6:F1}”, CalculateArea(poly));
}
else if (poly == Figure.Square || poly == Figure.Circle)
{
if (i == j) Console.Write(“{0,6:F1}”, CalculateArea(poly));
else Console.Write(“{0,6}”, ” “);
}
else if (poly == Figure.Trapezoid)
{
this.t = j; // 사다리꼴의 경우에만 값을 하나 더 추가
Console.Write(“{0,6:F1}”, CalculateArea(poly));
}
}
Console.WriteLine();
}
Console.WriteLine();
}
}
}

class Program
{
static void Main(string[] args)
{
AreaCalculator a = new AreaCalculator();
a.PrintAllFigureArea();
do
{
a.GetKeyboardInput();
a.Print();
Console.WriteLine(“다시 하려면 ENTER 키를 누르시고 종료하려면 ESC 키를 누르세요”);
} while (Console.ReadKey().Key != ConsoleKey.Escape);

}
}
}