/*
* 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);
}
}
* 循环的三要素还是要做为一个checklist来作,initial, condition,increment
* 即初始化语句,条件结束语句,增量语句一定要齐全,否则程序不合法,本例中,注意
* 了初始化语句, 条件结束语句,但是忘记了增量语句,这也是比较容易犯的错误
* 本例中的初始化语句和增量语句是一样的,可以统一到一起.
* 03.关于条件编译:
* 背景: 这个周末,读了一些<code complete>,<The C++ Program Language>
* 以及一些关于代码风格的电子书, 对于常量,比较合理的还是使用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 <stdio.h>
#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 <stdio.h>
#include <stdlib.h>
#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");
}