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");}
/* * 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");}