第四章学习的主要内容为:
串、数组和广义表
一、首先是串的模式匹配
使用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==' ') return false; else return true; }
还有就是输出的最后一个字母后面仍然带有空格
测试一下
char a[3]; a[0]=' '; cout<<a[0]<<"***"<<endl;
输出的结果为 ***
在最后输出时加上
if(t[j]==' '&&t[j+1]==' ') break; cout << t[j++];
可以解决问题
四、总结,其实实现的思路都不算难,但是还是要基本功扎实才好把思路都呈现出来,还有一些细节的地方都要做好,写出来的代码才符合预期。
五、慢慢地觉得打代码是一件有挑战有乐趣的事,还是要抓紧时间多读多看代码,学以致用,多打些题,才能有所成长。