| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 826 人关注过本帖
标题:一道ACM比赛题,我做了一下,但是调不出结果,求高人指点!
只看楼主 加入收藏
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
一道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++;
    }
}
搜索更多相关主题的帖子: 表达式 
2011-04-03 19:50
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:1 
我也很纠结,看不懂你的编译器的报错。。。

免费赠送河蟹一只
2011-04-03 20:20
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
估计是你的指针使用有问题

免费赠送河蟹一只
2011-04-03 20:21
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:1 
主要是我没碰到过这种报错。。。只见过类似的

免费赠送河蟹一只
2011-04-03 20:22
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
也在此为楼主顶一下帖子

免费赠送河蟹一只
2011-04-03 20:24
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:0 
回复 5楼 pcbaichi
好久没看到你了

勤能补拙,熟能生巧!
2011-04-03 20:37
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:1 
顶个贴吧,看LZ写的好复杂

我的地盘
2011-04-03 22:11
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:7 
那个字符串指针好像,还没分配空间吧?

百度了一下,第一次分配是像你那样,之后好像还要用循环分配,每个字符串的空间,要不然
我的VC6.0 就死在这,只找到这一个问题,后面的不大会
while(c)
    {
        scanf("%s",*c);
        c++;
    }
2011-04-03 22:58
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
收藏
得分:0 
泪流满面啊!!!
感谢各位仁兄热心帮助!
我第一次发帖,没想到大家速度这么快,我会好好研究大家的建议的,调试出以后我会向大家报告问题所在,再次感谢哈……
2011-04-03 23:28
gklifg
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2011-3-27
收藏
得分:0 
问题解决了,多谢bccn的提醒,我确实忘了循环分配空间了。还有一个问题就是judge函数里的循环条件不能是“p”应该是“*p != '\0'”,因为字符串一般都不满。下面是改正后的代码:
#include<stdio.h>
#include<malloc.h>

int judge(char *s)//判断合法性的的函数
{
    int judge = 0;//用judge的值判断p所指的值与前一个有效值是不是都是数字或都是运算符。
    char *p = s;
    while(*p != '\0')
    {
        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++;
    }
    if(judge == 1)
        return 1;
    else
        return 0;
}
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);
    int i = 0;
    while(i < t)
    {
        s = (char *)malloc(50*sizeof(char));
        c[i] = s;
        i++;
    }
    i = 0;
    while(i < t)
    {
        scanf("%s",c[i]);
        i++;
    }
    i = 0;
    while(i < t)
    {
        flag = judge(c[i]);
        if(flag)
            printf("yes.\n");
        else
            printf("no.\n");
        i++;
    }
}
2011-04-04 19:14
快速回复:一道ACM比赛题,我做了一下,但是调不出结果,求高人指点!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026519 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved