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

原创 2006年05月29日 11:53:00

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

蓝桥杯 ALGO-155 算法训练 C++ CH08 01

算法训练 C++ CH08 01   时间限制:1.0s   内存限制:256.0MB      问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   frie...
  • qq_22530055
  • qq_22530055
  • 2017-02-16 22:57:36
  • 1820

[蓝桥杯] C++ CH08 01

C++ CH08 01 问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream& operator(std::istream&, zr...
  • wzhCAlex
  • wzhCAlex
  • 2017-03-14 09:16:26
  • 315

算法训练 C++ CH08 01

算法训练 C++ CH08 01 时间限制:1.0s 内存限制:256.0MB问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::os...
  • ldsh304
  • ldsh304
  • 2016-12-31 14:58:56
  • 415

蓝桥杯-算法训练-C++ CH08 01

算法训练-C++ CH08 01   问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream& operator ...
  • qq_41550842
  • qq_41550842
  • 2018-01-05 11:19:34
  • 69

关于公平与公正的感想

  山中的老虎没有大小之分,而蜂群却有工蜂与蜂王之别,同样狼群也有狼王,人世间最大的不公在于人是需要群体性生活的生物,愈是进化到现代社会便愈是如此,科学技术越来越发达,分工也就越来越细,一个人想要更好...
  • aifor
  • aifor
  • 2010-03-11 17:51:00
  • 758

1501171314-蓝桥杯-算法提高 c++_ch02_01

算法提高 c++_ch02_01   时间限制:1.0s   内存限制:512.0MB        编写一个程序,利用强制类型转换打印元音字母大小写10种形式的ASCII码...
  • wangluoershixiong
  • wangluoershixiong
  • 2015-01-17 13:19:30
  • 1270

创业和创业团队的感想感悟

关于创业和创业团队的感想感悟:1.做事做产品;2.事在人为;3.管理和文化
  • m0sh1
  • m0sh1
  • 2017-11-14 16:59:15
  • 248

算法练习——C++CH 08 01

问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream&operator   friend std::istream&opera...
  • zm1_1zm
  • zm1_1zm
  • 2017-03-28 08:40:24
  • 466

关于学习生活记录的感想总结

今年从4月开始决定写博客记录自己学习过程,但是直到今天才不过写了1篇而已,中间没有坚持,这一年感觉过得很糟糕,从很久开始我就明白自己有很大缺陷,平时难以克服懒惰心理,做事总是拖拖拉拉,搞到现在也没个好...
  • hyc9200
  • hyc9200
  • 2017-11-24 21:13:10
  • 2266

关于Linux的感想

关于Linux的感想最近一周比较清闲,于是有了较多的学习时间,加上最近思考了一些运维自动化的事,结合自己的linux经验,算是“玩linux”玩了一周。基本是在CentOS 7.2下。大学时候,我主要...
  • festone000
  • festone000
  • 2017-04-28 16:40:58
  • 312
收藏助手
不良信息举报
您举报文章:CH08[02]:关于循环和条件编译及const的感想
举报原因:
原因补充:

(最多只允许输入30个字)