第二轮测试
首先感谢上次提出建议和提供测试用例的朋友们!
上次出错的主要原因是
1. 没有考虑到减法不满足结合律,和加法不同。
2. 整个系统封闭性不强
不过我的主要目的是自动机模拟人脑的谓词演算得出的结论是否有效,在软件开发时是否可以帮助导出问题的结构,在测试时是否可以有效地帮助理解bug产生的原因。
这两个目的我都达到了。这个研究的意义就在于人们在不了解问题真正结构之前只能进行推导,如何系统地从谓词演算过程中导出机器模型就显得十分重要和有意义了。
这里贴出源码进行第二轮测试
1 P1 bug:cordump,
2 P2 bug:计算错误,算式合法性判断错误
P1:P2 给分比:3:1
3 算式第一个数必须是非负整数
[解决办法]
一,考虑一下你的这条语句 printf( "exception in divide\n ");
1/2+3/5出错(2*3+4*5亦错),以下是出错信息:
----------------------------------------------------
test 1/2+3/5
1/2+3/5 is compiled OK
exception in divide
----------------------------------------------------
二,括号的功能没有!
三,给个你参考下:
#include <stdio.h>
char token;
/*定义程序要使用到的一些函数*/
void match( char expectedToken ) /*对当前的标志进行匹配*/
{
if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/
else
{
printf( "cannot match\n ");
exit(1); /*匹配不成功,退出程序*/
}
}
int low( void )/*用于计算表达式中级别最低的运算*/
{
int result = mid(); /*计算比加减运算优先级别高的部分*/
while(( token == '+ ' ) || ( token == '- ' ))
if ( token == '+ ')
{
match( '+ '); /*进行加法运算*/
result += mid();
break;
}
else if ( token == '- ')
{
match( '- '); /*进行减法运算*/
result -= mid();
break;
}
return result;
}
int mid( void )/*用于计算表达式中级别较高的运算*/
{
int div; /*除数*/
int result = high(); /*计算比乘除运算优先级别高的部分*/
while(( token == '* ' ) || ( token == '/ ' ))
if ( token == '* ')
{
match( '* '); /*进行乘法运算*/
result *= high();
break;
}
else if (token == '/ ')
{
match( '/ '); /*进行除法运算*/
div = high();
if( div == 0 ) /*需要判断除数是否为0*/
{
printf( "除数为0.\n " );
exit(1);
}
result /= div;
break;
}
return result;
}
int high( void )/*用于计算表达式中级别最高的运算,即带()的运算*/
{
int result;
if( token == '( ' ) /*带有括号的运算*/
{
match( '( ' );
result = low();/*递归计算表达式*/
match( ') ');
}
else if ( token> = '0 '&&token <= '9 ' ) /*实际的数字*/
{
ungetc( token, stdin ); /*将读入的字符退还给输入流,为读取整个数*/
scanf( "%d ", &result ); /*读出数字*/
token = getchar(); /*读出当前的标志*/
}
else
{
printf( "The input has unexpected char\n "); /*不是括号也不是数字*/
exit(1);
}
return result;
}
main()
{
int result; /*运算的结果*/
printf( "*****************************************\n ");
printf( "**Welcome to use this simple calculator**\n ");
printf( "**Please input a multinomial like **\n ");
printf( "** 6-3*(5-1)/2+14/7 **\n ");
printf( "*****************************************\n ");
token = getchar(); /*载入第一个符号*/
result = low(); /*进行计算*/
if( token == '\n ' ) /* 是否一行结束 */
printf( "The answer is : %d\n ", result );
else
{
printf( "Unexpected char! ");
exit(1); /* 出现了例外的字符 */
}
scanf( "%d ",result);
return 0;
}
------解决方案--------------------
14*2*2/7/2*2/2/2+1+8-9-3+4*5-6+5*5/5+4-6/3*2
这个算式仍出错
正确结果应该是大概应该是21吧,