计算器问题----求助高手解决!!!
我现在想要实现一个简单的计算器,本来是一个比较简单的问题,但是,我在编码的过程中遇到几个问题:
1.限制用户的输入,我要求的是用户输入2个double型数据,我如何控制呢?
double t1,t2,t3;
while(1)
{
cout < < "\n请输入2个数: ";
while(! (cin> > t1> > t2) )
{
cout < < "请重新输入2个数: " < <endl;
cin.clear();
cin.ignore(80, '\n ');
}
用这段代码基本上能控制,但是,当我输入 123 123.45.6.7
系统接收123 123.45;我想问有什么办法控制用户输入我不期望出现的东西.
2.double的位数问题,我在float.h中看了double的有关设置
#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG 53 /* # of bits in mantissa */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP 308 /* max decimal exponent */
#define DBL_MAX_EXP 1024 /* max binary exponent */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
#define DBL_MIN_EXP (-1021) /* min binary exponent */
#define _DBL_RADIX 2 /* exponent radix */
#define _DBL_ROUNDS 1 /* addition rounding: near */
我怎样限制用户的输入要在这个表示范围呢???
3.以下是我现在的源代码:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include "process.h "
void main()
{
char ch,op;
double t1,t2,t3;
while(1)
{
cout < < "\n请输入2个数: ";
while(! (cin> > t1> > t2) )
{
cout < < "请重新输入2个数: " < <endl;
cin.clear();
cin.ignore(80, '\n ');
}
cout < < "请输入操作符 " < <endl;
cin> > op;
switch(op)
{
case '+ ':t3=t1+t2;cout < < "结果是 " < <t3 < <endl;break;
case '- ':t3=t1-t2;cout < < "结果是 " < <t3 < <endl;break;
case '* ':t3=t1*t2;cout < < "结果是 " < <t3 < <endl;break;
case '/ ':
if(t2!=0)
{
t3=t1/t2;
cout < < "结果是 " < <t3 < <endl;
break;
}
else
{
cout < < "除数不能为0! " < <endl;
continue;
}
default:
cout < < "操作符输入错误! ";
continue;
}
cout < < "退出计算器吗?若是请按y或者Y,按n或者N继续! " < <endl;
cin> > ch;
if(ch== 'y '||ch== 'Y ')
break;
if(ch== 'n '||ch== 'N ')
continue;
}//end while(1)
//system( "pause ");
}
望各位高手帮忙!!!
[解决办法]
1 可以读取输入到string中,然后转化到 double 看看数据格式是否正确 ~
[解决办法]
命令行的小程序,就别太认真了,有足够检查就可以了。
[解决办法]
将输入成串
用正则式检查或自己检查串是不是符合double格式
[解决办法]
bool format(const char *p)
{
bool bResult = false;
const char *pos;
for (; *p != '\0 '; p++)
{
if (*p == '. ' && !bResult)
{
pos = p;
bResult = true;
}
else if (*p == '. ' && bResult)
return false;
}
if ((p - pos) <= 3)
return true;
return false;
}
我这里是((p - pos) <= 3 就是保留2位小数的,如果你是多点就多点
用atol有个不好就是象1..3这种也会被转成功
顶
[解决办法]
用一个换行结束的while将输入以单字符存入数组,结尾加\0形成字符串
验证字符串的组成格式很容易