• 第四章学习小结


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

    串、数组和广义表

    一、首先是串的模式匹配

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

     可以解决问题

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

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

    
    
  • 相关阅读:
    重新理解js的执行环境和闭包
    给开发插上想象力的翅膀
    Vue源码的初始化以及数据驱动逻辑
    解析Vue源码之前
    前端模块化发展介绍和未来展望
    现代前端框架具备的特征分析及Vue、React对比
    始于Flux的单项数据流发展简单介绍
    用面向对象编程解决常见需求场景
    【Docker】之重启容器相关命令
    【Java】之获取CSV文件数据以及获取Excel文件数据
  • 原文地址:https://www.cnblogs.com/gwpsf/p/10704391.html
Copyright © 2020-2023  润新知