にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

C

flexで字句解析器を作る

コンパイラ入門をゆっくり勉強中。 字句解析(lex, flex)の章と構文解析(yacc, bison)の章に分かれているので、今日は字句解析のみ使って構文解析してみる。 最終的な目標は電卓の作成。 本の中で紹介されているコードを流用して、さらにリエントラントなスキ…

autoconf/automake

autoconf / automake を使ってみよう!の手順をトレースして、autoconf/automakeを試してみた。 面倒なMakefile書きが楽になるのはありがたいと思う一方、バッドノウハウの塊っぽい印象を受けた。

Problem 15

Problem 14がなかなか解けないので先に15を解くことにする。 14の計算が終わらないのはきっとアルゴリズムが悪いんだな…。 2x2のマス目の左上からスタートした場合、引き返しなしで右下にいくルートは 6 つある。 では、20 × 20 のマス目ではいくつのルート…

Problem 13

以下の50桁の数字100個の総和の上位10桁を求めよ。 Problem 13 - PukiWiki Rubyだとこの数値を型を気にすることなく計算できて楽なのだけど…。 #include <stdio.h> #include <stdlib.h> #include <math.h> static char values[100][50] = { "371072875339021027987979982208375902465101</math.h></stdlib.h></stdio.h>…

Problem 12

(前略) では、501 個以上の約数をもつ最初の三角数はいくらか。 Problem 12 - PukiWiki 約数チェックを全探索してるといつまでも終わらなかったので大幅に削減しました。 #include <stdio.h> #include <math.h> void problem012() { int ans; int term; /* 項の値 */ int term</math.h></stdio.h>…

Problem 11

日課の一問。 (略) 上の 20 × 20 の数字のなか、赤くマークされた数字の積は 26 × 63 × 78 × 14 = 1788696 となる。 上下左右斜めのいずれかの方向で連続する4つの数字の積のうち最大のものを求めよ。 Problem 11 - PukiWiki 横方向・縦方向・右斜め下方向・…

Problem 10

もう一つ解くよ。 10以下の素数の和は2 + 3 + 5 + 7 = 17である. 200万以下の全ての素数の和を計算しなさい. Problem 10 - PukiWiki Problem 7で使ったis_prime関数を流用して素数判定する予定だったけど、Wikipediaの素数判定の項にあるサンプルプログラム…

Problem 9

今日も一つ、解いていくよ。 ピタゴラスの三つ組(ピタゴラスの定理を満たす整数)とはa Problem 9 - PukiWiki 順番にやっていくだけで充分。二重のfor文から抜けたかったのでgotoを使用。 #include <stdio.h> #define NUM_MAX 1000 void problem009() { int ans; int a</stdio.h>…

Problem 8

以下の1000桁の数字から5つの連続する数字を取り出して その積を計算する。そのような積の中で最大のものの値はいくらか (略) Problem 8 - PukiWiki こりゃまたでかい数値だなぁー、これは文字列として扱うしかないな、と思った。 #include <stdio.h> #include <string.h> #in</string.h></stdio.h>…

Problem 7

10001番目の素数を求めます。 素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり、6番目の素数は 13 である。 10001 番目の素数を求めよ。 Problem 7 - PukiWiki 力技で順番に数えていきました。 #include <stdio.h> #include <math.h> #define PRIME_ORDER 10001 int</math.h></stdio.h>…

Problem 6

今回は簡単だな。まだまだ序盤だからか。 最初の10個の自然数について、その和の二乗と、二乗数の和は以下の通り。 1² + 2² + ... + 10² = 385 (1 + 2 + ... + 10)² = 3025 これらの数の差は 3025 - 385 = 2640 となる。 同様にして、最初の100個の自然数に…

Problem 5

久しぶりにデスクトップPCの前に座ったので続きを。 2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり、そのような数字の中では最小の値である。 では、1 から 20 までの整数全てで割り切れる数字の中で最小の値はいくらになるか。 Problem 5 - …

Problem 4

左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、最大のものは 9009 = 91 × 99 である。 では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。 Problem 4 - PukiWiki 求める数は6桁になるという…

Problem 3

13195 の素因数は 5、7、13、29 である。 600851475143 の素因数のうち最大のものを求めよ。 Problem 3 - PukiWiki 以下のステップでプログラムを作成。 target:素因数分解の対象となる数(600851475143)、divider:割る数、loop_max:dividerの上限、とする。 …

Problem 2

フィボナッチ数列の項は前の2つの項の和である。 最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 Problem 2 - PukiWiki 最初、「項(の値)が…

Problem 1

Problem 1から順番にやっていきます。 10未満の自然数のうち、3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり、 これらの合計は 23 になる。 同じようにして、1,000 未満の 3 か 5 の倍数になっている数字の合計を求めよ。 Problem 1 - Puki…

Project Eulerを始めてみる

gomi-boxさんのところで、Project Eulerをやっていて興味を惹かれたので、私も挑戦してみることにします。 最近プログラムを書いていない鬱憤晴らしと勉強を兼ねてC言語で。 まずは環境作り 問題を解くのに集中できるよう、解答プログラムのテンプレートを用…

CRC32で少し困った

C

仕事の話なので詳細は書けないが、自分の書いたCRC32を照合するコードが合わない。 CRC32の計算そのものはzlibのAPIを使ったからまず計算方法が間違っているということはないだろう。 考えられるのは、 zlibのcrc32関数に渡すデータ範囲を間違えている(仕様…

やっぱりCでオブジェクト指向的な記述って難しいのね

C OOP

以前のエントリで挙げた参考サイトでは、Cの記述方法でオブジェクト指向「風」にプログラミングする方法が書いてあったが、クラスの宣言などから丸々オブジェクト指向的な記述にするのは、かえって可読性を損ないそうだなぁ、と少し書いてみてマクロの嵐にな…

初めてのC++

Cでオブジェクト指向的記述をしようとしているのに、C++のコードを今まで書いたことがない私。 せっかくなので、CでOOPの参考という意味も込めて、テストコードを書いてみることにした。 とりあえずぐぐって出てきた入門サイトに書いてある内容を分かった範…

参考サイト

CでOOP関連エントリ ぐぐってみると解説サイトがさらに結構あった。 Cによるオブジェクト指向の記述 Cによるオブジェクト指向'風'プログラミング Cで実現する「ぷちオブジェクト指向」:CodeZine メモ オブジェクトの内部構造を隠す方法。 まず、抽象データ…

「C言語でオブジェクト指向」のためのTODO

C OOP

調べる 他の言語におけるOOP(分けて見たけど特に意図はない) Smalltalk, JAVA, C++, Objective-C, C# Perl, Ruby, Python, PHP ガベージコレクション 組み込みで使うための課題とかとかとか Boehm GCを使ってみたり あんまり思いつかなかったけど知りたいこ…

C言語でオブジェクト指向に挑戦してみる〜追記

C OOP

昨日のエントリの参考にしたのはDirectFBのコードでした。 一昨年ぐらいに初めてコードを読んでみて、マクロを上手く使ってクラスや継承のような仕組みを作っているなぁと思ったのが、Cでオブジェクト指向(っぽいこと)ができそうだという考えを持ったきっ…

C言語でオブジェクト指向に挑戦してみる

C OOP

「オブジェクト指向でなぜつくるのか」という本を買って、ちょっとずつ読んでいます。オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―作者: 平澤章出版社/メーカー: 日経BP社発売日: 2004/06/03メディア: 単行本購入:…

開発時に「うわぁ…」となる他人のコード(というかそれ以前の話)

会社でソフトウェアを開発するとき、大半の場合、一人ではなく複数人(場合によっては大人数)で開発することになります。自分が一からコードを書くのならともかく、他の人が書いたコードを修正しなくてはならない場合ももちろんあります。 私はまだへっぽこ…

do { 〜 } while (0) なマクロ

C

複数の式からなる関数マクロに、こんな表現があった。 #define nullcheck(x) do { \ if (x == NULL) { \ printf("NULL!\n"); \ } else { \ printf("not NULL!\n"); \ } \ } while(0) なぜdo〜while(0)で囲ってあるのかと思ったが、こうすることによって文末…

gotoを使ってみる

C

大学時代にCを学んだとき、誰に言われたか「gotoは基本使うな」というのがやたらと頭にあって、それ以来バカの一つ覚えみたいにgotoを知らないCプログラミングをしてきた私です。 しかし、会社に入ってから使いどころさえ間違えなければgotoは有用に使えると…

ハッシュテーブルを実装してみる

急に思い立ってCでハッシュテーブルを実装してみました。 C言語での文字列を扱うプログラムというのがあまり得意ではないせいか中途半端に時間がかかってしまった。 ほとんどテストはしていないけど、以下のメソッドを使えるようにしてみた。 put: テーブル…

擬似malloc続き

擬似mallocを作ってみるの続きです。 リングバッファの要領で(というかまんまリングバッファ)、ついつい入れてしまったmallocをあとから置き換えるためのmallocモドキを改良(?)してみました。 もちろんこんなのがmallocの完全な置き換えにはなるはずも…

擬似mallocを作ってみる

C言語でmallocは便利だけれども、開発で多くの人が関わっている場合、他人のメモリリークや不正なアドレスへのアクセスなどのあおりを受けてSegmentation Faultなんていうことが結構あるそうな。 mallocで獲得したいメモリサイズが毎回固定の場合は、動的に…