
【实验简介】字符串是由零个或多个字符的顺序排列所组成的数据结构,字符串在计算机处理中使用非常广泛。通过本次实验理解字符串运算的原理,掌握主要算法的实现。
【实验内容】
建立字符串类,并实现求子串、字符串赋值、字符串连接等运算符重载函数,实现字符串的模式匹配功能。编写一个能够统计字符串中各个字符出现频度的函数。
【主要代码】
#include const defaultSize=128; #include class AString { public: AString(int sz=defaultSize);//构造函数,构造一个最大长度为sz,实际长度为0的字符串 AString( char *init);//构造函数,构造一个最大长度为maxsize,由init初始化的新字符串对象 void output(){cout< ~AString(){ delete []ch ;} // 析构函数 // int Length()const { return curLength;}//返回*this的实际长度 AString operator()(int pos,int len);//求子串 int operator==(AString& ob) {return strcmp(ch ,ob.ch)==0;}//判断传是否相等 int operator!=(AString& ob) {return strcmp(ch ,ob.ch)!=0;} int operator!(){return curLength==0;};// AString& operator=(AString& ob);//串赋值 AString& operator+=(AString& ob);//串连接 char operator[]( int i);//取当前串的第i的字符 int Find(AString pat,int k);//简单模式的匹配算法,返回第一次匹配成功的位置)*/ void frequency(char *p);//统计各种字符出现的次数 char *ch;//串存放数组 private: int curLength;//串实际长度 int maxSize;//存放数组的最大长度 }; AString ::AString(int sz) { maxSize=sz; ch=new char[ maxSize+1]; curLength=0;ch[0]='\\0'; } AString::AString( char * init) { int len=strlen(init); maxSize=(len>defaultSize)?len:defaultSize; ch=new char[maxSize+1]; curLength=len; strcpy(ch,init); } AString::AString (AString& ob)//字符串的复制构造函数 { maxSize=ob.maxSize; ch=new char[maxSize+1]; strcpy(ch,ob.ch); } AString AString::operator()(int pos ,int len)//求子字符串 { AString temp; if (pos<0||pos+len-1>=maxSize||len<0) { temp.curLength=0; temp.ch[0]='\\0'; } else { if(pos+len-1>=curLength) len=curLength-pos; temp.curLength=len; for (int i=0,j=pos;j // temp.ch[len]='\\0'; } return *this; } AString & AString::operator=(AString& ob) { if (&ob!=this) { delete[]ch; ch= new char[maxSize+1]; curLength=ob.curLength; strcpy(ch,ob.ch); } else cout<<"字符串自身赋值出错!\\n"; return *this; } AString & AString::operator+=(AString & ob) { char *temp=ch; int n=curLength+ob.curLength ; int m=(maxSize>=n)?maxSize:n; ch =new char[m]; maxSize=m; curLength=n; strcpy(ch,temp); strcat(ch,ob.ch); delete []temp; return *this; } char AString::operator[](int i)//字符串重载操作:取当前的字符串*this的第n个字符 { if ( i<0 || i>=curLength ) return ch[i]; } int AString::Find(AString pat,int k) { int i,j; for(i=k;i<=curLength-pat.curLength;i++) { for(j=0;j if(j==pat.curLength) return i; } return -1; } void AString::frequency(char *p) { int k[27]={0}; for(int i=0;p[i]!='\\0';i++) { if(p[i]>'z'||p[i]<'A') k[0]++; else if(p[i]=='a'||p[i]=='A')k[1]++; else if(p[i]=='b'||p[i]=='B')k[2]++; else if(p[i]=='c'||p[i]=='C')k[3]++; else if(p[i]=='d'||p[i]=='D')k[4]++; else if(p[i]=='e'||p[i]=='E')k[5]++; else if(p[i]=='f'||p[i]=='F')k[6]++; else if(p[i]=='g'||p[i]=='G')k[7]++; else if(p[i]=='h'||p[i]=='H')k[8]++; else if(p[i]=='i'||p[i]=='I')k[9]++; else if(p[i]=='j'||p[i]=='J')k[10]++; else if(p[i]=='k'||p[i]=='K')k[11]++; else if(p[i]=='l'||p[i]=='L')k[12]++; else if(p[i]=='m'||p[i]=='M')k[13]++; else if(p[i]=='n'||p[i]=='N')k[14]++; else if(p[i]=='o'||p[i]=='O')k[15]++; else if(p[i]=='p'||p[i]=='P')k[16]++; else if(p[i]=='q'||p[i]=='Q')k[17]++; else if(p[i]=='r'||p[i]=='R')k[18]++; else if(p[i]=='s'||p[i]=='S')k[19]++; else if(p[i]=='t'||p[i]=='T')k[20]++; else if(p[i]=='u'||p[i]=='U')k[21]++; else if(p[i]=='v'||p[i]=='V')k[22]++; else if(p[i]=='w'||p[i]=='W')k[23]++; else if(p[i]=='x'||p[i]=='X')k[24]++; else if(p[i]=='y'||p[i]=='Y')k[25]++; else//(p[i]=='z'||p[i]=='Z') k[26]++; } char m[]={"abcdefghlijkmnopqrstuvwxyz"}; for(int j=0;j<27;j++) { if(j==0) cout<<"非字符"<<"出现次数为:"< cout<<"字符"< } void main() { AString hyb_a("“Great mind think alike!”"); cout<<"hyb_a字符是:"< int n=hyb_a==hyb_b;//==判断hyb_a,hyb_b是否相等 cout<<"新建对象hyb_b,并用hyb_a初始化,判断hyb_a与hyb_b是否相等(等返回1,不等返回0):"; cout< cout<<"新建对象hyb_c;"; hyb_c.output(); cout< cout<<"连接hyb_b,hyb_c.保存在hyb_b中:"< cout<<"新建对象hyb_d,并用hyb_b初始化:"< AString hyb_e=hyb_d.operator()(2,6);cout< cout< cout<<"“Hong Yongbo”在hyb_b中找首次出现的位置是:"< } 【实验过程】 【实验体会】 字符串实验我也单独的写了两天,由于字符串没怎么学,所以就照抄课本上的程序,发现有很多错误之处,也有些函数没必要,显得有些故弄玄虚,该合并的合并不更好吗?题目要求求个字符出现的频率,从别的课本查到frequency(char *p)函数计算,显得有些繁琐,觉得还有改进空间,设想写两个for()语句,几经尝试还是失败了。程序中有好些运算符重载,这是以前我都不看不学的,这次狠狠的学习了,不是一般的难。这个程序存在的问题是: “取hyb_d的前一至五个字符为hyb_e: “Great mind think alike!”:Said Hong Yongbo. hyb_e的第八个字符是:m “Hong Yongbo”在hyb_b中找首次出现的位置是:6” 取前五个字符时就去了整个字符串,字符串匹配时hyb_b中位置并不是6,调试了好些时间,还是以失败告终。诚然还有些瑕疵,但也不失为小的成功,有待继续进
