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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ch5 条件,循环和其他语句

条件,循环和其他语句
  • cdpac
  • cdpac
  • 2015-05-27 21:58
  • 217

tensorflow17《TensorFlow实战Google深度学习框架》笔记-08-02 使用循环神经网络实现语言模型 code

01 PTB数据集介绍# 《TensorFlow实战Google深度学习框架》08 循环神经网络 # win10 Tensorflow1.0.1 python3.5.3 # CUDA v8.0 cud...
  • longji
  • longji
  • 2017-04-10 20:47
  • 1248

算法训练 C++ CH08 01

问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream& operator   friend std::istream& o...

编译原理语法分析对循环语句和条件判断语句编写词法分析编译程序,只能通过一遍扫描完成

实验目的:对循环语句和条件判断语句编写词法分析编译程序,只能通过一遍扫描完成。(用c++实现) 实验要求: (1)关键字: for if then else while do 所有关键字都是小写...

《Hadoop The Definitive Guide》ch08 MapReduce Features

1. 计数器 1) 内置计数器 2) 用户自定义Java计数器 [ate: /local/nomad2/hadoop/tomwhite-hadoop-book-32dae01 ] >> hado...

算法训练 C++ CH08 01

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

[蓝桥杯] C++ CH08 01

C++ CH08 01 问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream& operator<>(std::istream&, ...

算法训练 C++ CH08 01

问题描述   已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式:   friend std::ostream& operator   friend std::istream& o...

利用python进行数据分析ch02(usa.gob)

利用python进行数据分析(usa.gob)

iOS学习- 22 Core Data by Tutorials - CH02

NSManagedObject Subclasses Bow Tie sample
  • cdanx
  • cdanx
  • 2016-06-17 14:02
  • 201
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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