과제 2 홀수 마방진
using System;
using Com.JunBo.Logic;
namespace Com.JunBo.Basic
{
public class Program
{
public static void Main()
{
IMagic odd = new OddMagicSquare(5);
odd.Make();
odd.Print();
}
}
}
namespace Com.JunBo.Logic
{
public interface IMagic
{
void Print();
void Make();
}
}
namespace Com.JunBo.Logic
{
public class OddMagicSquare : IMagic
{
private int[,] mabang;
public OddMagicSquare(int n)
{
this.mabang = new int[n, n];
}
public OddMagicSquare():this(3){}
public virtual void Make()
{
int top = mabang.GetLength(0) - 1;
int x = 0;
int y = top / 2;
mabang[x, y] = 1;
for (int i = 2; i <= (top + 1) * (top + 1); i++)
{
int tempX = x;
int tempY = y;
if (x - 1 < 0) x = top;
else x--;
if (y - 1 < 0) y = top;
else y--;
if (mabang[x, y] != 0)
{
x = tempX + 1;
y = tempY;
}
mabang[x, y] = i;
}
}
protected int SumRow(int row)
{
int count = mabang.GetLength(1);
int total = 0;
for (int i = 0; i < count; i++) total += this.mabang[row,i];
return total;
}
public virtual void Print()
{
for (int i = 0; i < mabang.GetLength(0); i++)
{
for (int j = 0; j < mabang.GetLength(1); j++) Console.Write("{0}\t", mabang[i,j]);
Console.Write("R:{0}\n", SumRow(i));
}
}
}
}
using System;
using Com.JunBo.Logic; //사용
/*
* 홀수 마방진 이란.
* 가로 세로가 같은 홀수의 수 크기를 가진 마방진
* 해당 마방진은 대각으로 올라가며 0이 아닌 수가 들어있을 경우 아래로 내려간다.
* 행의 합과 열의 합이 같다.
*/
namespace Com.JunBo.Basic
{
public class Program
{
public static void Main()
{
int LineNum = 0;
for (; LineNum % 2 == 0 || LineNum <= 0; ) //홀수 받을 때까지 재시작
{
Console.Write("출력할 줄(홀수)수:");
LineNum = Int16.Parse(Console.ReadLine()); //문자를 숫자로 변경
}
IMagic odd = new OddMagicSquare(LineNum); //객체생성 생성자에 위의 숫자를 대입
odd.Make(); //마방진 만듬
odd.Print(); //마방진 출력
}
}
}
namespace Com.JunBo.Logic //인터페이스를 만들어둠
{
public interface IMagic
{
void Print();
void Make();
}
}
namespace Com.JunBo.Logic //위의 인터페이스의 자세한 설명
{
public class OddMagicSquare : IMagic //인터페이스를 상속받음
{
private int[,] mabang;
public OddMagicSquare(int n) //위에 입력한 숫자로 2차원 배열을 만듬
{
this.mabang = new int[n, n];
}
public OddMagicSquare() : this(3) { } // 오버로드 인자가 없을 경우는 3짜리 배열 만듬
public virtual void Make() // 마방진 만드는 함수
{
int top = mabang.GetLength(0) - 1; // GetLength(0)는 [x][], GetLength(1)은 [][x]의 총 크기
int x = 0;
int y = top / 2; // 중간부분에 Y를 시작
mabang[x, y] = 10; // 초기값 10
for (int i = 20; i <= (top + 1) * (top + 1) * 10; i += 10)// 반복 i의 값이 배열의총수x10을 넘기면 멈춤
{
int tempX = x; // 위 아래
int tempY = y; // 좌 우
if (x - 1 < 0) x = top; // x,y가 0보다 작아지면 배열수의 가장 높은수로 이동
else x--; // 아니면 하나 뺌
if (y - 1 < 0) y = top;
else y--;
if (mabang[x, y] != 0) // 값이 0이 아니면 아래로 내려감
{
x = tempX + 1;
y = tempY;
}
mabang[x, y] = i; // i를 넣음
}
}
protected int SumR(int row) // 행의 합
{
int count = mabang.GetLength(1); // 행의 수
int total = 0;
for (int i = 0; i < count; i++) total += this.mabang[row, i]; //합계 구함
return total; // 반환
}
protected int SumC(int col) // 열의 합
{
int count = mabang.GetLength(0); // 열의 수
int total = 0;
for (int i = 0; i < count; i++) total += this.mabang[col, i]; //합계 구함
return total; // 반환
}
public virtual void Print() // 출력
{
for (int i = 0; i < mabang.GetLength(0); i++) // 행 반복
{
for (int j = 0; j < mabang.GetLength(1); j++) Console.Write("{0}\t", mabang[i, j]); // 열 반복 출력
Console.Write("행{0}\n", SumR(i)); // 행의 합계
}
for (int i = 0; i < mabang.GetLength(0); i++) Console.Write("열{0}\t", SumC(i)); // 열의 합계
}
}
}
'1학년 2학기 > C언어' 카테고리의 다른 글
[C#] 과제 3 - 지뢰 찾기 이해하기 (0) | 2014.12.11 |
---|---|
WINDOWS API PPT (0) | 2014.12.08 |
[C#] 과제 1 - 허수의 표현 (0) | 2014.12.05 |
성적처리기 (완료) (0) | 2014.09.28 |