在这一章中,我们将编写计算器程序运运算的核心部分。我先为核心编制一个ANSI C版本,然后将详细探讨如何使这些代码在Palm OS中运行。
设计计算器核心
在开始写代码之前,我们必须知道到底该做些什么。一个解决这类问题的好方法是建立一个包括程序各个状态并通过箭头相连表示它们之间的关系的状态表。对本程序来说,这也是个很好的办法,因为这个程序比一般的程序包含了更多状态和状态关联。
你也可以将状态表制成一个大纲的形式,这样会使对程序看的更清楚。通常,当我想知道程序该完成哪些工作时,我就先从纸上画出程序的状态表大纲。不管效果如何,你可以先试一下。我建议你在看我的状态表之前,自己先做一个。表14-1是我所做的状态表。
状态:
操作算子――->改变符号―――>完成操作、显示结果、保存―――>回到预备状态
等于号(equal)―――>改变符号―――>完成操作、显示结果―――>回到预备状态
清除号(clear) ―――>清除数字和操作算子―――>回到预备状态
完成号(Done)―――>拷贝当前显示结果到粘贴板―――>退出程序预备状态:显示当前数字
0―――>显示0―――>预备状态
其它数字―――>显示数字―――>插入状态
改变符号―――>显示-0―――>预备状态
小数点―――>显示0. ―――>小数状态
指数―――>出错声―――>预备状态
整数状态:显示一个整数
数字―――>如果是允许输入的最大数字,则发出声音―――>整数状态
改变符号―――>给当前整数取反―――>整数状态
小数点―――>在当前整数后加小数点显示―――>小数状态
指数―――>在当前整数后加e+0显示―――>指数状态
小数状态:显示一个数字和一个小数点
数字―――>如果是允许输入的最大数字就发出报警音―――>把新输入的数字显示在最后―――>小数状态
改变符号―――>给当前显示的数字取反显示―――>小数状态
小数点―――>出错音―――>小数状态
指数―――>在当前显示的数字后加e+0显示―――>指数状态
指数预备状态:带e+0的显示一个数字
0―――>指数预备状态
其它数字―――>显示数字的指数―――>指数输入状态
改变符号―――>改变当前的指数符号为e-0―――>指数预备状态
小数点―――>出错音―――>指数预备状态
指数号―――>出错音―――>指数预备状态
指数输入状态:显示带指数的数字
数字―――>如果是允许输入的最大数字就发出警报音―――>给输入的数字取指数―――>指数输入状态
改变符号―――>改变指数的符号―――>指数输入状态
小数点―――>出错音―――>指数输入状态
指数号―――>出错音―――>指数输入装态
在我开始的状态表中,还有一些其它的状态,例如Clear状态和Enter Second Number状态,但当我画完时,发现这些状态可以很容易的融入到其它的状态中去。在开始编程之前,状态表将是一个很好的参考材料,所以我建议都来使用状态表,况且其它的大多数界面都要比本例子简单和直接。
剩余代码
为了好解释有关将ANSI标准C代码导入Palm OS的知识,我用以下的方法编写了程序。在程序中有一些可移植性的错误,看看你自己在看导入代码那部分之前能不能将它找出来。
新的calc.h
这个calc.h将代替上一章最后创建的“虚”文件,以便我们做进一步的调试。
#ifndef CALC_H
#define CALC_H
//////////////////////////////////////////////////////////////////////////////
// calc.h
// Definitions for the generic calculation routines.
// Copyright (c) 1999, Robert Mykland. All rights reserved.
//////////////////////////////////////////////////////////////////////////////
///////////////////////
// Global Prototypes //
///////////////////////
void calcAdd( void ); // Queue an add operation
void calcAppend( int ); // Append a digit
void calcChangeSign( void ); // Change the sign of the entry
void calcClear( void ); // Clear/reset the calculator
void calcDivide( void ); // Queue a divide operation
void calcEquals( void ); // Finish the current operation
void calcExponent( void ); // Start gathering the exponent
void calcMultiply( void ); // Queue a multiply operation
void calcPoint( void ); // Start gathering the fraction
void calcSubtract( void ); // Queue a subtraction operation
//////////////////////
// Global Constants //
//////////////////////
#define MAX_NUMBER_SIZE 40
#endif // CALC_H
现在头文件已经转换为了原来传统类型的文件。
Calc.c的普通代码
在文件calc.c中实现了calc.h中定义的函数。我们将对这些代码进行简单的描述,因为它们和Palm OS关系不大,只是ANSI中实现计算器功能的普通代码。
//////////////////////////////////////////////////////////////////////////////
// calc.c
// Implements a generic calculator.
// Copyright (c) 1999, Robert Mykland. All rights reserved.
//////////////////////////////////////////////////////////////////////////////
//////////////
// Includes //
//////////////
#include "app.h" // The definitions for this application
#include "calc.h" // The definitions for this module
///////////////////////
// Global Prototypes //
///////////////////////
void calcAdd( void ); // Queue an add operation
void calcAppend( int ); // Append a digit
void calcChangeSign( void ); // Change the sign of the entry
void calcClear( void ); // Clear/reset the calculator
void calcDivide( void ); // Queue a divide operation
void calcEquals( void ); // Finish the current operation
void calcExponent( void ); // Start gathering the exponent
void calcMultiply( void ); // Queue a multiply operation
void calcPoint( void ); // Start gathering the fraction
void calcSubtract( void ); // Queue a subtraction operation
//////////////////////
// Local Prototypes //
//////////////////////
设计计算器核心
在开始写代码之前,我们必须知道到底该做些什么。一个解决这类问题的好方法是建立一个包括程序各个状态并通过箭头相连表示它们之间的关系的状态表。对本程序来说,这也是个很好的办法,因为这个程序比一般的程序包含了更多状态和状态关联。
你也可以将状态表制成一个大纲的形式,这样会使对程序看的更清楚。通常,当我想知道程序该完成哪些工作时,我就先从纸上画出程序的状态表大纲。不管效果如何,你可以先试一下。我建议你在看我的状态表之前,自己先做一个。表14-1是我所做的状态表。
状态:
操作算子――->改变符号―――>完成操作、显示结果、保存―――>回到预备状态
等于号(equal)―――>改变符号―――>完成操作、显示结果―――>回到预备状态
清除号(clear) ―――>清除数字和操作算子―――>回到预备状态
完成号(Done)―――>拷贝当前显示结果到粘贴板―――>退出程序预备状态:显示当前数字
0―――>显示0―――>预备状态
其它数字―――>显示数字―――>插入状态
改变符号―――>显示-0―――>预备状态
小数点―――>显示0. ―――>小数状态
指数―――>出错声―――>预备状态
整数状态:显示一个整数
数字―――>如果是允许输入的最大数字,则发出声音―――>整数状态
改变符号―――>给当前整数取反―――>整数状态
小数点―――>在当前整数后加小数点显示―――>小数状态
指数―――>在当前整数后加e+0显示―――>指数状态
小数状态:显示一个数字和一个小数点
数字―――>如果是允许输入的最大数字就发出报警音―――>把新输入的数字显示在最后―――>小数状态
改变符号―――>给当前显示的数字取反显示―――>小数状态
小数点―――>出错音―――>小数状态
指数―――>在当前显示的数字后加e+0显示―――>指数状态
指数预备状态:带e+0的显示一个数字
0―――>指数预备状态
其它数字―――>显示数字的指数―――>指数输入状态
改变符号―――>改变当前的指数符号为e-0―――>指数预备状态
小数点―――>出错音―――>指数预备状态
指数号―――>出错音―――>指数预备状态
指数输入状态:显示带指数的数字
数字―――>如果是允许输入的最大数字就发出警报音―――>给输入的数字取指数―――>指数输入状态
改变符号―――>改变指数的符号―――>指数输入状态
小数点―――>出错音―――>指数输入状态
指数号―――>出错音―――>指数输入装态
在我开始的状态表中,还有一些其它的状态,例如Clear状态和Enter Second Number状态,但当我画完时,发现这些状态可以很容易的融入到其它的状态中去。在开始编程之前,状态表将是一个很好的参考材料,所以我建议都来使用状态表,况且其它的大多数界面都要比本例子简单和直接。
剩余代码
为了好解释有关将ANSI标准C代码导入Palm OS的知识,我用以下的方法编写了程序。在程序中有一些可移植性的错误,看看你自己在看导入代码那部分之前能不能将它找出来。
新的calc.h
这个calc.h将代替上一章最后创建的“虚”文件,以便我们做进一步的调试。
#ifndef CALC_H
#define CALC_H
//////////////////////////////////////////////////////////////////////////////
// calc.h
// Definitions for the generic calculation routines.
// Copyright (c) 1999, Robert Mykland. All rights reserved.
//////////////////////////////////////////////////////////////////////////////
///////////////////////
// Global Prototypes //
///////////////////////
void calcAdd( void ); // Queue an add operation
void calcAppend( int ); // Append a digit
void calcChangeSign( void ); // Change the sign of the entry
void calcClear( void ); // Clear/reset the calculator
void calcDivide( void ); // Queue a divide operation
void calcEquals( void ); // Finish the current operation
void calcExponent( void ); // Start gathering the exponent
void calcMultiply( void ); // Queue a multiply operation
void calcPoint( void ); // Start gathering the fraction
void calcSubtract( void ); // Queue a subtraction operation
//////////////////////
// Global Constants //
//////////////////////
#define MAX_NUMBER_SIZE 40
#endif // CALC_H
现在头文件已经转换为了原来传统类型的文件。
Calc.c的普通代码
在文件calc.c中实现了calc.h中定义的函数。我们将对这些代码进行简单的描述,因为它们和Palm OS关系不大,只是ANSI中实现计算器功能的普通代码。
//////////////////////////////////////////////////////////////////////////////
// calc.c
// Implements a generic calculator.
// Copyright (c) 1999, Robert Mykland. All rights reserved.
//////////////////////////////////////////////////////////////////////////////
//////////////
// Includes //
//////////////
#include "app.h" // The definitions for this application
#include "calc.h" // The definitions for this module
///////////////////////
// Global Prototypes //
///////////////////////
void calcAdd( void ); // Queue an add operation
void calcAppend( int ); // Append a digit
void calcChangeSign( void ); // Change the sign of the entry
void calcClear( void ); // Clear/reset the calculator
void calcDivide( void ); // Queue a divide operation
void calcEquals( void ); // Finish the current operation
void calcExponent( void ); // Start gathering the exponent
void calcMultiply( void ); // Queue a multiply operation
void calcPoint( void ); // Start gathering the fraction
void calcSubtract( void ); // Queue a subtraction operation
//////////////////////
// Local Prototypes //
//////////////////////
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126899/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-126899/
该内容为来自ITPUB博客的转载声明,给出了博客链接,强调转载需注明出处,否则将追究法律责任。
768

被折叠的 条评论
为什么被折叠?



