NGプログラム集

なんとなくやりたいことはわかるけど、これでは思ったように動かないプログラム例を紹介します。

if文

if文の条件式

変数xの値が0から1の間のとき、OKと表示したい。

      if ( 0<x<1 )     printf("OK\n");  /** NG **/
      if ( 0<x && <1 ) printf("OK\n");  /** OK **/

ループ文

無限ループを使ってはいけない

無限ループは原則使用禁止にしています。これは適切に条件文を書けば無限ループにしなくて良いからです。

      for(;;) {  /*** 無限ループ ***/
           ...
      }

      while(1) { /*** 無限ループ ***/
           ...
      }

同様に breakやcontinue文の使用も最小限にしましょう。これらは必要な時がありますが、 ループの条件文をうまく書けば少なくできる場合が多いです。

0.1は無理数!?

0.1を10個加えれば数学的には1.0になります。しかし、コンピュータ的には 1.0になる保証はありません。つまり、0.1*10 != 1.0 です。 これは0.1がコンピュータ上では無理数となってしまうからです。

以下のプログラムを実行すると、最後は 0.999999 となるはずです。

int main(void)
{
  float x;
  for ( x=0.0 ; x<=1.0 ; x+=0.01 )
    printf("%f\n", x);
}

NGプログラム集

プログラムを実行すると確かに答はでるのだが…ちょっと書き直した方が良いと思われるプログラム例を紹介します。 レポートでこのようなプログラムを出すと再提出になります。

if文

例1: 冗長な条件式

変数xの値が3以下のとき「小」と表示し、3から7の間のとき「中」と表示し、 7以上のとき「大」と表示したい。

      /** NG **/
      if ( x<=3 ) printf("小\n");
      else if ( 3<x && x<7 ) printf("中\n");
      else if ( 7<=x ) printf("大\n");

      /** OK **/
      if ( x<=3 ) printf("小\n");
      else if ( x<7 ) printf("中\n");
      else printf("大\n");

繰り返し文

「和が1になるまで計算する」プログラムの例です。ループ条件は 「和sumが1ではないならば繰り返す」と言う意味で書いたのでしょう。 0.01を100回足せば1になりますよね。どこが間違いか分かりますか?
/** NG **/
#include <stdio.h>
int main( void ) {
  float sum=0.0;
  do {
    sum += 0.01;
    printf("sum=%f\n", sum);
  } while( sum != 1.0 );
  return 0;
}
先ほど書いたように、0.01は二進法では有理数ではありません。 従って、100回足しても丁度1になる保証はありません。
Last modified: Fri Jul 25 15:31:52 JST 2003