CH 08[02]:ループと条件コンパイルとconstについての感想


/* * FileName : 08P02randomeven.c*Version:1.0*Copyright:*Author:Mingdyn Ju*original:*First Created on 29-05-06 10:37*Last modified on*----------------------------------------------------------------------------------------------*Description:generate the even integer between 2 to 100*random.h,random.cに新しいライブラリ関数RandomIntegerInEven()およびRandomIntegerInOdd()を追加
/*  * DEBUG INFO: * 01.いくつかのエラー情報は、GetLine()のエラーを誘導します.generalを参照してください.hのGetYesOrNo(*)*の説明では、これらの情報を消去してもこの情報は現れない. * 02.プログラム実行エラー:最初の偶数をリストした後、yesを再度入力したが、答えをリストできず、ハングアップしたようだ.*問題はどこにあるのか:random.hの中のRandomIntegerInEven()は問題がありますか?int RandomIntegerInEven(int low,int high){int number;number=RandomInteger(low,high);エラー箇所、文はwhileサイクル中にwhile(TRUE){if(number%2=0)return(number);}}*修正後の関数:int RandomIntegerInEven(int low,int high){int number;while(TRUE){number=RandomInteger(low,high);if(number%2=0)return(number);}*ループの3要素はやはり1つのchecklistとして作らなければならない.initial,condition,increment*は初期化文、条件終了文、増分文は必ずそろっていなければならない.そうしないと、プログラムは合法ではない.この例では、*は初期化文、条件終了文に注意しているが、増分文を忘れている.これも比較的犯しやすいエラー*本例の初期化文と増分文は同じであり、統一することができる.      * 03.条件のコンパイルについて:*背景:今週末、いくつかを読んで、*といくつかのコードの風格の電子書籍について、定数に対して、比較的に合理的なのはやはりconstを使って定義して、C自身から言えば、いくつかの間違いを避けることができて、その上この方法も比較的にC++の規範に合って、つまりできるだけ#defineの問題を少なくします:乱数の特徴のため、デバッグ中にRandomize()を閉じて、私は以下の方法を採用しました:const int RELEASED=0;             .....             #if RELEASED             Randomize();#endifしかしRELEASEDを1に変更した後、Randomize()がコンパイルされていないようです:RELEASEDを投げて、直接以下の文を使います:#if 1 Randomize()#endifが正常に実行された場合、constでプリコンパイル定数を定義するのは問題があります.解決:次の文で正常に実行できます:#define RELEASED 1.....             #if RELEASED             Randomize();#endif結論:#defineについてはまだ簡単には処理できず、状況によって処理する.簡単に#defineを用いてマクロを定義すれば、上記のようなことは起こらないが、多方面の学習を通じて、自分の理解と実践を加えることで、やはりいくつかのことを学ぶことができる.嬉しいです.             */
#include #include "random.h"#include "general.h"
#define RELEASED  1
const int INTNUM_MIN = 2;const int INTNUM_MAX = 100;
/* Function prototype section */  static void GiveRandomEven(void);  static void GiveInstruction(void);
int main(int argc, char *argv[]){  if (GetYesOrNo("Would you want read the instruction about this progame?"))  { GiveInstruction();  }  #if RELEASED  Randomize();  #endif  while (TRUE)  { GiveRandomEven();    if (!GetYesOrNo("Would you like to try again?")) break;  }      PauseProgram();           return 0;}
/*FUNCTION DEFINITION*/
  static void GiveRandomEven(void)  { int evenInt;    evenInt = RandomIntegerInEven(INTNUM_MIN,INTNUM_MAX);    printf("%d/n",evenInt);  }      static void GiveInstruction()  { printf("This program give random even integer between %d and %d/n",                                                 INTNUM_MIN,INTNUM_MAX);    puts("yes to continue, and no to exit!/n");  }
付録:general.h,general.c
/*  FileName : general.h  Version  : 1.0  Copyright:   Author   : Mingdyn Ju  First Created on 29-05-06 09:37  Last modified on  -----------------------------------------------------  Description:  */#ifndef _general_h#define _general_h
#include "genlib.h"/**/bool GetYesOrNo(string s);/**/void PauseProgram(void);
#endif
/* * FileName : general.c*Version:1.0*Copyright:*Author:Mingdyn Ju*original:*First Created on 29-05-06 09:52*Last modified on*------------------------------------------------------------------Description:general.hの実装*CAUTION:*/
#include #include #include "strlib.h"#include "general.h"
bool GetYesOrNo(string prompt){ string answer;
while(TRUE){printf("%s",prompt);/*この文はDEV_C++の下でコンパイルすると常にこのコンパイルエラー情報を提示して、作者ライブラリ(genlib.h)*に問題があるかどうか分かりません*しかしこの関数をgeneral.hライブラリに入れた後、エラーメッセージは消えてしまいました.なぜですか*[Warning] assignment makes pointer from integer without a cast     */    answer=GetLine();        if (StringEqual(answer,"yes")) return (TRUE);    if (StringEqual(answer,"no")) return (FALSE);    printf("Please answer yes or no./n");  }    }  void PauseProgram(void){ system("PAUSE");}