第四章学习的主要内容为:
串、数组和广义表
一、首先是串的模式匹配
使用BF算法,先写函数声明和主函数:
#include<iostream> #include<string> using namespace std; int Index_BF(string, string, int); int main() { string s,t; cin>>s; cin>>t; if(Index_BF(s, t, 1)==-1)cout<<0; else cout<<Index_BF(s, t, 1); }
先输入主串和子串,在根据BF算法的返回值进行输出;
BF算法的函数:
int Index_BF(string s, string t, int pos) { int i,j; i = pos-1; j = 0; while(i<s.length() && j<t.length()) { if(s[i]==t[j]){++i; ++j;} else{i=i-j+1; j=0;} } if(j==t.length()) return i-t.length()+1; else return -1; }
要注意pos所代表的含义,上述代码中pos为在主串中的位置,因此用于计数的i为pos-1,而后面返回的位置则为i-t.length()+1,根据样例,若不进行修改,则返回值为5,而不为六。
二、用三元组表储存稀疏矩阵:
先定义储存非零元素行列值信息的node结构体,在使用一个结构体来包含稀疏矩阵的信息:
#include<iostream> #define maxsize 100 using namespace std; typedef struct { int r; int c; int v; }node; struct sparse { int m; int n; int N; node data[maxsize]; };
因为稀疏矩阵中非零元素很少,题目给出N<=500,因此我认为可以将maxsize定义为100;
存放一个稀疏矩阵:
int k; sparse S; cin>>S.m>>S.n>>S.N; for(int i=0;i<S.N;i++) { cin>>S.data[i].c>>S.data[i].r>>S.data[i].v; }
先输入稀疏矩阵的行数、列数和矩阵中非零元素的个数;
然后输入稀疏矩阵的非零元素所在的行、列号和非零元素的值:
查询的非0数据k:
cin>>k; for(int i=0;i<S.N;i++) { if(k==S.data[i].v) { cout<<S.data[i].c<<" "<<S.data[i].r; break; } if(k!=S.data[S.N-1].v) cout<<"ERROR"; }
这里在测试的时候不太顺利,首先当k存在时要输出行列位置,并且跳出循环,第二个条件是k不存在时要输出ERROR,一开始写的是
if(k!=S.data[S.N].v)
cout<<"ERROR";
结果输出一个地址,第二个if语句执行的条件是满足k不存在且要执行的到最后一个非零元素,因此应该是k!=S.data[S.N-1].v
三、是AI核心代码
老师在课堂上给我们讲的思路已经十分清晰了;
主要是自己在写的时候细节的处理:
如我判断标点的函数写的就比较直接
bool isPunctuation(char ch) { ch = tolower(ch); if(ch>='0' && ch<='9' || ch>='a' && ch<='z' || ch=='I'||ch==' '||ch=='\0') return false; else return true; }
还有就是输出的最后一个字母后面仍然带有空格
测试一下
char a[3]; a[0]='\0'; cout<<a[0]<<"***"<<endl;
输出的结果为 ***
在最后输出时加上
if(t[j]==' '&&t[j+1]=='\0') break; cout << t[j++];
可以解决问题
四、总结,其实实现的思路都不算难,但是还是要基本功扎实才好把思路都呈现出来,还有一些细节的地方都要做好,写出来的代码才符合预期。
五、慢慢地觉得打代码是一件有挑战有乐趣的事,还是要抓紧时间多读多看代码,学以致用,多打些题,才能有所成长。