Project1
标题:
这里能问C++的问题吗……
[打印本页]
作者:
繁星千羽
时间:
2014-11-2 15:58
标题:
这里能问C++的问题吗……
如题...本人数据结构的作业不会做了...
按照自己推算过一遍感觉没有错误,编译也没出错的代码
void ChirlStr(SEQSTRING T) //求子串//for后面内容没有执行
{
int len=T.len;
for(int i=0;(len-i)==1;i++) //整数i为子串长度
{
for(int x=0,j=i;x>len-1;x++)
{ cout<<T.ch[x];
if (j==0)
{
cout<<endl;
j=i;
x=x-i;
}
else
j--;
}
}
cout<<"除此以外还有一个“”空串"<<endl;
}
SEQSTRING ContectStr(SEQSTRING T1,SEQSTRING T2) //连接两个串
{ //T2和T1的混乱?
int len1=T1.len;
int x=0;
T.len=0;
for(int i = 0;i==len1;)
{
T.ch[i]=T1.ch[i];
i++;
x = i;
cout<<len1<<"\t";
cout<<"i="<<i<<"\t";
cout<<"x="<<x<<"\t";
}
cout<<T.ch<<endl; //将T1赋值给T后输出T的值,实际上输出了T2?
cout<<"T.len="<<x<<endl;
for(int len2=i+1;len2==T2.len;len2++)
{
T.ch[i]=T2.ch[len2];
i++;
}
T.len=T1.len+T2.len;
return T;
}
int ppStr(SEQSTRING T1,SEQSTRING T2) //判断T2是否在T1中//假设T1为123,T2为1,输出匹配不能?
{
int len=T1.len,len2=T2.len;
int x;
if (len2>len) return (0);
for(int i=0;i>(len-len2);i++) //j为T中的起始位,j>(len-i)即T1中已经找不到其他长度与T2相等的子串
{
for(x=0;x==len2;x++)
{ if (T2.ch[x]!=T1.ch[i+x]) x=len2-1;
else if (x==(len2-1)) return (1);
}
}
return (0);
}
复制代码
#include<iostream.h>
#define MAXSIZE 80
typedef struct
{char ch[MAXSIZE];
int len;
}SEQSTRING;
SEQSTRING S,T1,T2,T;
SEQSTRING InputStr() //输入字符串
{ int i;
T.len=0;
cout<<"请输入字符串:"<<endl;
cin>>T.ch;
for(i=0;T.ch[i]!='\0';i++)
{ T.len++;
cout<<T.ch[i]<<" ";
}
cout<<endl;
return T;
}
void OutputStr(SEQSTRING T) //输出字符串
{ cout<<T.ch<<endl;
}
int LenStr(SEQSTRING T) //求字符串长度
{ return (T.len);
}
int EqualStr(SEQSTRING T1,SEQSTRING T2) //判字符串是否相等
{int i=0;
if(T1.len!=T2.len)
return(0);
else
for(i=0;i<T1.len;i++)
if (T1.ch[i]!=T2.ch[i])
return(0);
else
return(1);
}
void ChirlStr(SEQSTRING T) //求子串//for后面内容没有执行
{
int len=T.len;
for(int i=0;(len-i)==1;i++) //整数i为子串长度
{
for(int x=0,j=i;x>len-1;x++)
{ cout<<T.ch[x];
if (j==0)
{
cout<<endl;
j=i;
x=x-i;
}
else
j--;
}
}
cout<<"除此以外还有一个“”空串"<<endl;
}
SEQSTRING ContectStr(SEQSTRING T1,SEQSTRING T2) //连接两个串
{ //T2和T1的混乱?
int len1=T1.len;
int x=0;
T.len=0;
for(int i = 0;i==len1;)
{
T.ch[i]=T1.ch[i];
i++;
x = i;
cout<<len1<<"\t";
cout<<"i="<<i<<"\t";
cout<<"x="<<x<<"\t";
}
cout<<T.ch<<endl; //将T1赋值给T后输出T的值,实际上输出了T2?
cout<<"T.len="<<x<<endl;
for(int len2=i+1;len2==T2.len;len2++)
{
T.ch[i]=T2.ch[len2];
i++;
}
T.len=T1.len+T2.len;
return T;
}
int ppStr(SEQSTRING T1,SEQSTRING T2) //判断T2是否在T1中//假设T1为123,T2为1,输出匹配不能?
{
int len=T1.len,len2=T2.len;
int x;
if (len2>len) return (0);
for(int i=0;i>(len-len2);i++) //j为T中的起始位,j>(len-i)即T1中已经找不到其他长度与T2相等的子串
{
for(x=0;x==len2;x++)
{ if (T2.ch[x]!=T1.ch[i+x]) x=len2-1;
else if (x==(len2-1)) return (1);
}
}
return (0);
}
SEQSTRING CRSTR(SEQSTRING T1,SEQSTRING T2)
{
return T1;
}
void main() //主函数
{ int i=0,j=1,len=0,l;
int ch1;
S.len=0;
T1.len=0;
T2.len=0;
while(1)
{cout<<"\t\t\t 串子系统\n"<<endl;
cout<<"\t\t**********************************"<<endl;
cout<<"\t\t* 1------输入串 *"<<endl;
cout<<"\t\t* 2------求串长 *"<<endl;
cout<<"\t\t* 3------串比较 *"<<endl;
cout<<"\t\t* 4------求子串 *"<<endl;
cout<<"\t\t* 5------联接串 *"<<endl;
cout<<"\t\t* 6------串匹配 *"<<endl;
cout<<"\t\t* 7------插入串 *"<<endl;
cout<<"\t\t* 8------删除串 *"<<endl;
cout<<"\t\t* 9------显示串 *"<<endl;
cout<<"\t\t* 0------返 回 *"<<endl;
cout<<"\t\t**********************************\n"<<endl;
cout<<"\t 请输入选项序号(0--9)!"<<endl;
cin>>ch1;
switch(ch1)
{
case 1: S=InputStr();break;
case 2: len=LenStr(S);cout<<len<<endl;break;
case 3:
{ T1=InputStr();
T2=InputStr();
l=EqualStr(T1,T2);
if(l) cout<<"串1与串2相等!"<<endl;
else cout<<"串1与串2不等!"<<endl;
break;
}
case 4:
{
S=InputStr();
ChirlStr(S);
break;
}
case 5:
{
T1=InputStr();
T2=InputStr();
T=ContectStr(T1,T2);
OutputStr(T);
break;
}
case 6:
{T1=InputStr();
T2=InputStr();
l=ppStr(T1,T2);
if(l) cout<<"匹配成功"<<endl;
else cout<<"匹配失败"<<endl;
break;
}
}
if(ch1==0) break;
}
}
复制代码
作者:
繁星千羽
时间:
2014-11-2 16:04
本帖最后由 繁星千羽 于 2014-11-2 16:12 编辑
这里是出现的问题。
④求所有子串。
输入123
输出以下内容
1 2 3
除此以外还有一个“”空串
⑤链接两个串
输入123
输入456
输出以下内容
1 2 3
4 5 6
456
T.len=0
456
⑥串匹配
输入123
输入1
输出以下内容
1 2 3
1
匹配失败
我自己的感觉的话……好像是for里面的语句都没被执行,但是原因完全不知道
作者:
繁星千羽
时间:
2014-11-2 16:29
好像自己解决了……for里面应该是符合才执行……OTZ
作者:
RyanBern
时间:
2014-11-2 17:53
既然问题解决了,我就说点题外话吧。
LZ现在做的是C++中只含C语言的部分(除了cout这货之外和C没什么区别)。所以说你学的还不是真正的C++,真正的C++是不会这样编写数据结构的。不过把C语言练好也是一个基本功吧。
C++里面的for语句是标准化循环语句,执行到它时,它先执行第一部分的内容,然后去判断第二部分成立与否,机制类似于while。做完这两步之后才是真正想循环体。每次循环结束后,自动执行for头部第三部分内容,然后判断第二部分成立与否,执行循环体……
注意,如果for循环体不加花括号的话,只会循环它后面的第一句。
CPP 代码
复制
for
(
int
i=
0
;i<forever;i++
)
cout
<<
"I love you.
\n
"
;
for
(
int
i=
0
;i<forever;i++
)
cout
<<
"I love you.
\n
"
;
↑(女神用一个分号就拒绝了他)
上面例子表明,即使for循环真的是只有一句话,也不妨用花括号括起来(雾)
还有就是发现几个不合理的地方:
1.include<iostream>和include<iostream.h>这两个哪个可以?我印象中貌似是第一个。
2.不要随便用全局变量,否则你很容易忘记这个变量到底是什么。
3.主函数建议声明成int main,虽然void main 也可以过,不过有人说它是过时的写法?
4.case:后面可以不跟{},但是break一般情况下要有。
5.建议使用匈牙利命名法,增加可读性。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1