2004/05/07 総和を求めるイデオム 配列 a[i] ( i = 0 .. N ) の総和を変数 s に求める。 s = 0; /* 総和の値を初期化 (ご破算) */ for ( i = 0; i < N; i++ ) { s = s + a[i]; /* s の現在の値に a[i] を加えた物を s に入れる */ } /* s には、 a[0] .. a]N] の和が入っている。 == 型変換 float sum; /* 浮動小数点型の変数 */ int s; /* 整数型の変数 */ /* .. */ sum = s; /* 整数値を浮動小数点値に型変換する */ 整数型の数同士の計算は、整数値になる。割り算の場合は、これが不都合に なることがある ( 例 1/2 は 0 .. )。もし、整数値同士の割り算の結果を、 浮動小数点値にしたい場合は、演算の少くても一方を浮動小数点型にする必要 がある ( 1.0/2, 1/2.0, 1.0/2.0 はどれも 0.5 になる )。 # Q. なぜ、全ての数を浮動小数点型にしないのだろうか ? それなら、こんな # 面倒なことがおきないはずなのに.. # A. 少くても、次の二つの理由があります。 # 1) 速度が違います。整数同士の計算で済む計算を浮動小数点数で行うと数 # 倍遅くなることがあります。 # 2) 小数点型は、誤差を含む場合があります。整数型の場合は、そのような # 問題はありません。つまり、同じ数を整数値なら誤差が含まれないが、浮 # 動小数点数なら誤差を含んでしまう可能性があります。 # 何れにせよ、C 言語では、整数値と浮動小数点数は、完全に区別されて利用 # されていますので、プログラムを作る人間もそれを意識する必要があります。 == printf で '%' を出す方法 printf ( "%" ); としても上手く行かない。なぜなら、'%' は printf にとって特別な 意味があるから。 この場合は、次のように '%' を二つ重ねればよい。 printf ( "%%" ); == 型変換 ( float -> int ) 浮動小数点型の値を整数型の変数に代入すると、自動的に、小数点以 下の数は切り捨てられる。 四捨五入したいのであれば、代入前に 0.5 を加えればよい。 # 負の数の場合はどうなるか試してみよう。 == if 文 ( 条件文 ) 条件によって、やることをかえる。 if 文の構文 if ( 条件 ) 文1 else 文2 条件が成立したら 文1 を、そうでなければ、文2 を行う。 if ( 条件 ) 文 条件が成立したら 文 を、そうでなければ、何もしない。 # else 節が省略されたもの # if 文や、for 文では、文の中に文が含まれるので、色々と間違いがおきや # すい。失敗して間違えるよりは、多少手間でも解りやすい表現が望ましい。 # その為に、if 文や、for 文を使う場合は、必ず、{ と } を使うというのは、 # 一つのポイント # if ( 条件式 ) 文 # より、 # if ( 条件式 ) { # 文 # } # の方が良いし、 # if ( 条件式 ) 文1 else 文2 # より、 # if ( 条件式 ) { # 文1 # } else { # 文2 # } # の方が良い。 == 「条件」を作り出す演算子 関係演算子 数と数の関係を調べ、その結果を条件値 ( 真偽値 ) を返す < 小なり > 大なり <= 以下 >= 以上 == 等しい != 等しくない 論理演算子 真偽値から、新しい真偽値を求める演算子 && and ( 論理積 ) || or ( 論理和 ) ! not ( 否定 ) # 条件を書く場合の注意 # C 言語では、 # if ( a < x < b ) { .. } # とは、書けない、これと同じことは # if ( a < x && x < b ) { .. } # と書く。