| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1137 人关注过本帖
标题:我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各位高 ...
取消只看楼主 加入收藏
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
结帖率:78.26%
收藏
已结贴  问题点数:10 回复次数:12 
我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各位高手看一看。
#include"iostream"
#define Max 256
using namespace std;
typedef struct
{
    char ch[Max];
    int lenght;
}
SeqString;
void InitString(SeqString *s)
{
    char ch;
    int i=0;
    while((ch=getchar())!='\n'&&i<Max)
        s->ch[i++]=ch;
    s->lenght=i;
}
int Strlen(SeqString *s)
{
    return (s->lenght);
}
SeqString *substr(SeqString *s,int pos,int len,SeqString *sub)
{
    int i;
    if(pos<1||pos>s->lenght||len<1||len>s->lenght)
    {
        cout<<"error!!"<<endl;
    return NULL;
    }
    for(i=0;i<len;i++)
        sub->ch[i]=s->ch[pos+i-1];
    sub->lenght=len;
    return (sub);
}
int strcmp(SeqString *s,SeqString *t)
{
    int i,j;
    for(i=1,j=1;i<s->lenght,j<t->lenght;)
        {
            if(s->ch[i]==t->ch[j])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
        if(j>t->lenght)
            return (i-t->lenght+1);   
        else
            return 0;
   
}
void main()
{
    int i,k;
    SeqString *s,*t,*r;
    cout<<"构造一个串s!!"<<endl;
    InitString(s);
    cout<<"构造一个串t!!"<<endl;
    InitString(t);
    cout<<"请输入子串在主串中位置:";
    cin>>i;
    k=strcmp(substr(s,i,Strlen(t),r),t);
    cout<<k;
}
编译时出现这样的警告:
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(62) : warning C4700: local variable 's' used without having been initialized
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(64) : warning C4700: local variable 't' used without having been initialized
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(67) : warning C4700: local variable 'r' used without having been initialized

2011.4.29.obj - 0 error(s), 3 warning(s)
帮忙看一下,谢谢啦。
搜索更多相关主题的帖子: return 答案 
2011-04-29 09:09
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 2楼 配角
嗯,换了就可以了。但还是得不到正确的答案,检查函数,也没觉得哪里错,可是结果总是得到个0,不懂为什么
2011-04-29 11:49
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 2楼 配角
嗯,换了就可以了。但还是得不到正确的答案,检查函数,也没觉得哪里错,可是结果总是得到个0,不懂为什么
2011-04-29 11:50
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 6楼 pangding
就是比较两个字符串的大小。
    for(i=1,j=1;i<=s->lenght,j<=t->lenght;)
        {
            if(s->ch[i-1]==t->ch[j-1])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
串S和串T的字符一个一个比较,要是对应位置上的字符相同,指针i和指针j就向后移动,继续比较下一个字符。要是不相等,i就要回溯,需要从子串的第一个字符重新比较。
2011-04-29 12:42
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
以下是引用棉雨在2011-4-29 12:42:49的发言:

就是比较两个字符串的大小。
    for(i=1,j=1;i<=s->lenght,j<=t->lenght;)
        {
            if(s->ch==t->ch[j-1])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
串S和串T的字符一个一个比较,要是对应位置上的字符相同,指针i和指针j就向后移动,继续比较下一个字符。要是不相等,i就要回溯,然后子串像右移动一个字符
,再从字串的第一个字符跟主串相比较。
2011-04-29 12:57
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 9楼 pangding
我们这个学期刚刚开的数据结构课程,有很多东西都不懂,这个程序弄了很久都没有找到错在哪里。
谢谢你的指点。上课的时候再问问老师。
2011-04-29 22:10
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 11楼 棉雨
用串的strlen(SeqString *s)(求串长)、strcmp(SeqString *s,SeqString *t)(串的比较)、SubStr(SeqString *s,int pos,int len,SeqString *sub)(求子串)这三个串的基本操作来构造子串定位运算index(SeqString *s,SeqString *t).就是说,用那三个基本操作来实现子串定位操作的算法。
2011-04-30 10:24
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 13楼 玩出来的代码
我本来发表之前说要写说明要干什么的,忘记了,发表了才发现没写说明。呵呵,下次一定想好了再发表。
2011-04-30 10:29
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 12楼 辰星睿
不好意思,我又回复错了……我是想用串的strlen(SeqString *s)(求串长)、strcmp(SeqString *s,SeqString *t)(串的比较)、SubStr(SeqString *s,int pos,int len,SeqString *sub)(求子串)这三个串的基本操作来构造子串定位运算index(SeqString *s,SeqString *t).就是说,用那三个基本操作来实现子串定位操作的算法。最后输出的是模式串(也就是t串)在主串(串s)第一次出现时的首字符对应串s的位置。
2011-04-30 10:37
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 17楼 pangding
如果模式串只有一个字符,而且跟主串的第一个祖父相匹配,我想应该是返回1.
我这里for(i=1,j=1;i<s->lenght,j<t->lenght;)写错了,应该是i<=s->lenght&&j<=t->lenght才对。
2011-04-30 18:29
快速回复:我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各 ...
数据加载中...
 
   



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

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