2.有个程序希望大家帮看看,提提意见,谢谢
分别输入两个字符串,查找最长的部分,以下是代码,刚刚写完,新手,拍砖轻点哦。
希望大家可以给点建议,比如说麻不麻烦,可读性怎么样,算法,或者有什么改进了更好之类的
有时间就请帮看看代码,没时间就帮看看大体就可以了,不管怎么样谢谢了,会尽快结贴的,
我还发了一个类似的帖子,希望大家有时间也看看我另一个,谢谢。
另外,我是用gets语句完成输入,假如用c++的知识应该用什么输入呢,百度上的答案五花八门,主要是能输入空格。
- C/C++ code
#include<iostream>using namespace std;#include<string>/************下面函数解释: a[],b[]代表两个字符串, m,n代表从第几个开始相同,m代表a[] 开始相同的下标,n代表b[]开始相同的下标, j代表b[]字符串的字节数 因为是以a[]字符串为基准,b[]来寻找,所以b找完一遍就继续从头找, 此时用j字节数来限制************/int digui(char a[],char b[],int m,int n,int i,int j){ int k=0; //记录下有多少个相同的//用goto语句不断循环,循环几次就有几个相同字符,flag: m++; //a下标,第一个字符相同就看下一个 n++; //b下标,用途同上 if(m<=i&&n<=j) //防止越界 { k++; if(a[m]==b[n]) goto flag; } return k; //返回有多少个相同部分};/********输出函数解释:temp代表有多少个相同的,h代表从第几个开始相同*********/void output(char a[],char b[],int temp,int h){ int i; if(temp==0) cout <<"无公共部分"<<endl; else { cout<<"最长公共部分为:"; for(i=h;i<temp+h;i++) cout <<b[i]; cout <<endl; };}int main(){ int i,j; //记录两个字符串的字节数 int m,n; //循环变量 int k=0; //记录变量 int temp=0; //公共部分的个数 int h=0; //公共部分开始的位置 char a[30],b[30]; //两个字符串//字符串的输入 cout <<"第一个字符串:"; gets(a); //gets好像是c语言里的知识,假如用c++呢? cout <<"第二个字符串:"; gets(b);//记录下字节数 i=strlen(a); j=strlen(b);/*下面的两个if语句,用于比如a[]字符串为基准a[0]开始的有连续k个相同部分,a[1]开始有连续k1个相同部分,比较,取长的,用temp和h记录下相同个数和开始相同的位置*/ for(m=0;m<i;m++) { for(n=0;n<j;n++) { if(a[m]==b[n]) k=digui(a,b,m,n,i,j); if(k>temp) temp=k,h=n; k=0; }; } output(a,b,temp,h); return 0; }[解决办法]
1.那个using的位置
2.函数命名方式。digui?
3.用getline()可以实现读入空格
4.可以看看高质量C/C++
[解决办法]
建议尽量不要用goto语句···
[解决办法]
不是能不能用的问题···它容易带来错误和隐患。比如跳过对象的构造,变量的初始化等等···
[解决办法]
循环可以使用 while或者do while来实现,这些语句是结构化的,容易理解,也不易出错。
goto只有在一种情况下可用:跳出多层循环。而且使用中还要注意只能由内往外跳,决不能跳到某语句结构的内部。
......掌握不了的话,那就别用goto。
[解决办法]
标识符应该有清晰的含义,像你这样大量使用单字母命名变量会导致程序可读性很低,不得不大量增加注释,结果代码写得更长更难读。
那个叫digui的函数,你的意思是要做“递归”处理?但函数里并没有进行递归处理。这样的名字也不合适,标识符应做到名实相符。
一般来说需要函数配合的主程序的写法是:主程序里通常不做任何具体的数据处理,将各种数据处理过程都放到相应的函数中。这样的程序更为清晰,各种功能代码集中在自己的实现位置上,阅读起来更能抓住要点。
函数则尽量只做单一的事情,这一点你已经做到了。
这些都是结构化程序设计的要求,你现在用的是C++,那还应该按照面向对象的方式来设计程序。不过看起来你还没学到那些位置,现在给你说早了点。
[解决办法]
楼主是要求 两个字符串中最长相同子串吗?