輝々凛々

ガンバるってことは、素晴らしい事だ。

toColorCodeてなものを作った。

プログラムのソースをWebに上げるために、とりあえずソースコードには色づけしないとだめだろう! ってことで、色づけ君・・・もとい「toColorCode Ver.0.1」を作成しました。

機能と特長

  • C言語ソースの色づけします。
  • C言語ソースには一切手を加えなくてもOKです。

不具合と未対応機能

  • 色づけできるのは文字列とコメントだけです。キーワードには色づけできていません。
  • 文字列中にエスケープシーケンスのダブルクォートがあると色づけがおかしくなります。
  • っていうかバグだらけです。

その他

ソースを「<pre><code class="C">」~「</code></pre>」で囲むだけです。Eclipse上のJSEclipseプラグインを使用して作成しました。製作時間は6時間くらい。

んー、JSEclipseよりもFirebugの方が使いやすいや。

サンプル結果は↓

#include 
#include 
#include 
#define T (2*M_PI) // 周期
#define TRANGE_L (-4.0) // フーリエ区間の左端
#define TRANGE_R 8.0  // フーリエ区間の右端
#define MAX_N 1048576  // フーリエの項数
#define OMEGA (2*M_PI/T)  // 角速度
#define DIV_DRAW 1000  // 描画精度(大きいほど高精度)
#define TWIDTH   (T/DIV_DRAW) // 描画の区間幅
#define DIV_INTEG 200  // 台形則の精度

int g_n;
double da[MAX_N];
double db[MAX_N];

double f(double t);
double fourier_f(double t);
double a0(void);
double a(int n);
double b(int n);
void 	 initialize(void);

int main(int argc, char* argv[])
{
	double t;

	if (argc != 2) {
		printf("繰り返し回数nを引数にとってください\n");
		return EXIT_FAILURE;
	}
	g_n = atoi(argv[1]);
	if (g_n >= MAX_N) {
		printf("繰り返し過ぎです\n%d以内でお願いします\n", MAX_N);
		return EXIT_FAILURE;
	}

	// a0やak、bkは固定なので、先に求めておく
	initialize();

	for (t = TRANGE_L; t <= TRANGE_R; t += TWIDTH) {
		printf("%f %f\n", t, fourier_f(t));
	}
	return EXIT_SUCCESS;
}

double f(double t)
{
	while (t < 0) t += T;
	while (t > T) t -= T;
	if (0 <= t && t < T/2) {
		return 1.0;
	} else {
		return 0.0;
	}
}
/*double f(double t)
{
	while (t < 0) t += T;
	while (t > T) t -= T;
	return t/T;
}*/

double a0(void)
{
	double irange_l = 0.0, irange_r = T;
	double h = (irange_r - irange_l)/DIV_INTEG;
	double t;
	double up_side, bt_side;
	double sum_area = (f(irange_l)+f(irange_r))/2.0;
	double h2 = h*2;
	for (t = irange_l+h; t < irange_r-h; t += h2) {
		up_side = f(t);
		bt_side = f(t+h);
		sum_area += (up_side+bt_side);
	}
	sum_area *= h;
	return sum_area/T;
}

double a(int n)
{
	double irange_l = 0.0, irange_r = T;
	double h = (irange_r - irange_l)/DIV_INTEG;
	double t;
	double up_side, bt_side;
	double omegan = OMEGA*n;
	double sum_area = (f(irange_l)*cos(omegan*irange_l)+f(irange_r)*cos(omegan*irange_r))/2.0;
	double h2 = h*2;
	for (t = irange_l+h; t < irange_r-h; t += h2) {
		up_side = f(t)*cos(omegan*t);
		bt_side = f(t+h)*cos(omegan*t);
		sum_area += (up_side+bt_side);
	}
	sum_area *= h;
	return sum_area*2.0/T;
}

double b(int n)
{
	double irange_l = 0.0, irange_r = T;
	double h = (irange_r - irange_l)/DIV_INTEG;
	double t;
	double up_side, bt_side;
	double omegan = OMEGA*n;
	double sum_area = (f(irange_l)*sin(omegan*irange_l)+f(irange_r)*sin(omegan*irange_r))/2.0;
	double h2 = h*2;
	for (t = irange_l+h; t < irange_r-h; t += h2) {
		up_side = f(t)*sin(omegan*t);
		bt_side = f(t+h)*sin(omegan*t);
		sum_area += (up_side+bt_side);
	}
	sum_area *= h;
	return sum_area*2.0/T;
}

void initialize(void)
{
	int k;
	da[0] = a0();
	for (k = 1; k <= g_n; k++) {
		da[k] = a(k);
		db[k] = b(k);
	}
}

double fourier_f(double t)
{
	double sum = da[0];
	int k;
	for (k = 1; k <= g_n; k++) {
		sum += da[k] * cos(OMEGA*k*t) + db[k] * sin(OMEGA*k*t);
	}
	return sum;
}
関連記事

ツッコミの投稿


(ツッコミ非公開の場合はチェック)