C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[248] AD BC 포함 아득한 황금시대까지, 60갑자 계산기 소스.
김태선 [cppbuilder] 29 읽음    2026-01-23 16:28
//---------------------------------------------------------------------------

#include 
#pragma hdrstop
#include 

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}


//  60 갑자 환산 클래스

class	CKapJa
{
	bool	bBC;	// BC년인가

public:
	CKapJa()
	{
		bBC = false;
	}
	void	SetBC(bool yn)
	{
		bBC = yn;
	}

	int	GetIndx(int year)
	{
		if (bBC)
		{
			// BC1년부터 시작하고 경신년임.
			// 30000 = 60으로 나누어 떨어짐.
			// 여기에 BC1년 경신56이므로 이를 더해 빼면 값이 순차로 바뀌게 된다.
			year  = 30056 - year + 1;	// 1을 더한 것은 0부터 시작이 아니라 1부터 시작이라서.
			year = year % 60;
			return year;
		}

		// AD 경우.
		if (year >= 1984)
		{
			year -= 1984;
			year = year % 60;
			return year;
		}
		int n = 1984 - year;
		n = n % 60;
		n = 60 - n;
		return n % 60;
	}

	// 기준년보다 몇년전 인덱스를 구한다.

	int	GetIndxBefore(int year, int before)
	{
		int n = year - before;
		if (n > 0)
		{
			bBC = false;
			return GetIndx(n);
		}
		bBC = true;
		n = -n + 1;
		return GetIndx(n);
	}

	String 	GetName(int idx)
	{
		int sky = idx % 10;
		int earth = idx % 12;
		char *ss = "갑을병정무기경신임계";
		char *ee = "자축인묘진사오미신유술해";
		char buf[10];
		strncpy(buf, ss + sky * 2, 2);
		strncpy(buf + 2, ee + earth * 2, 2);
		buf[4] = 0;
		return String(buf);
	}
};

CKapJa KapJa;

//---------------------------------------------------------------------------
void TForm1::Add(String s)
{
	Memo1->Lines->Add(s);
}


void __fastcall TForm1::FormCreate(TObject *Sender)
{
	Memo1->Lines->Clear();
	Add("AD1년~ 신유(57)년부터 시작하고, BC1년 경신년(56)부터 시작함 ");
	// 지금 년도 계산
	unsigned short year, month, day;
	TDateTime t = Now();
	t.DecodeDate(&year, &month, &day);
	L1->Caption = t.DateString();

	Edit1->Text = year;
	Add(year);
	Add(KapJa.GetName(KapJa.GetIndx(year)));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::B1Click(TObject *Sender)
{
	bool bc = RBBC->Checked;
	KapJa.SetBC(bc);

	int year = Edit1->Text.ToIntDef(0);
	int idx = KapJa.GetIndx(year);
	Add(idx);
	Add(KapJa.GetName(idx));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	//  올해 기준 몇년 전
	unsigned short year, month, day;
	TDateTime t = Now();
	t.DecodeDate(&year, &month, &day);

	int n = Edit2->Text.ToIntDef(0);
	int idx = KapJa.GetIndxBefore(year, n);
	Add(idx);
	Add(KapJa.GetName(idx));
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
248 AD BC 포함 아득한 황금시대까지, 60갑자 계산기 소스. 김태선 29 2026/01/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.