关闭

CH08[02]:关于循环和条件编译及const的感想

444人阅读 评论(0) 收藏 举报

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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5929次
    • 积分:120
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条
    文章分类
    文章存档