一道ACM比赛题,我做了一下,但是调不出结果,求高人指点!
love8909最近在学一种新的表达式表示法,称之为<DotNotation>。定义如下:<DotNotation> := <Number> | <DotNotation><Dots><Operator><Dots><Number>
<Dots> := "" | <Dots>"."
<Operator> := exactly one of "+-*/"
<Number> := exactly one of "0123456789"
这是一个递归的定义,即是说
单个的数字是<DotNotation>
在<DotNotation>后连接任意数量的”.”(<Dots>),然后连接一个操作符(<Operator>),再接上任意数量的”.”,最后再接一个数字,得到的还是还是一个<DotNotation>
比如说,"5"是一个<DotNotation>,如果在后面接上".+.7",你将得到另一个<DotNotation>, 如果你再在后面接上"*..3"得到"5.+.7*..3",这还是一个<DotNotation>。
可是love8909很纠结,因为他竟然不会判断一个<DotNotation>是否合法,你能帮帮他吗?
Input
第1行一个数T,表示测试数据组数
后面T行每行一个长度为L的字符串(1 <= L <= 50)
Output
T行,每一行,如果合法,输出”Yes”,反之输出”No”
Sample Input
5
3+5
9..+.5...*....3
5.3+4
9*9*9*9*9*9*9*9*9*9*9*9*9*9
3.........../...........4
Sample Output
Yes
Yes
No
Yes
Yes
Source
love8909
/*上面是题目下面是我写的代码 */
//弹出一个错误提示框:Unhandled exception at 0x5823de8f (msvcr100d.dll) in love8909.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
#include<stdio.h>
#include<malloc.h>
int judge(char *s)//判断合法性的的函数
{
int judge = 0;//用judge的值判断p所指的值与前一个有效值是不是都是数字或都是运算符。
char *p = s;
while(p)
{
if(*p != '.')
{
if(*p >= '0'&&*p <= '9')
{
if(judge == 0)
{
judge = 1;
p++;
}
else
return 0;
}
else
{
if(judge == 1)
{
judge = 0;
p++;
}
else
return 0;
}
}
else
p++;
}
return 1;
}
void main()
{
int t = 1;
char *s;
char **c;//用来储存各个字符串的首地址。
int flag;
printf("Please input the data:\n");
scanf("%d",&t);
c = (char **)malloc(sizeof(char *)*t);
s = (char *)malloc(50*sizeof(char));
int i = 0;
while(c)
{
scanf("%s",*c);
c++;
}
while(c)
{
flag = judge(*c);
if(flag)
printf("yes.\n");
else
printf("no.\n");
c++;
}
}