第四章学习小结

第四章学习的主要内容为:

串、数组和广义表

一、首先是串的模式匹配

使用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++];

 可以解决问题

四、总结,其实实现的思路都不算难,但是还是要基本功扎实才好把思路都呈现出来,还有一些细节的地方都要做好,写出来的代码才符合预期。

五、慢慢地觉得打代码是一件有挑战有乐趣的事,还是要抓紧时间多读多看代码,学以致用,多打些题,才能有所成长。


上一篇:第四章学习小结


下一篇:C指针原理(41)-递归(2)