在第四章学习中我们学习了串和数组,也在PTA上做了三道编程题。由于基础打得不太好,我在做三道题目的时候其实都遇到了好多问题和困难。AI核心代码和串的模式匹配都参考了很多老师的代码以及看了很多网上博客等等的代码才明白怎么做。而对于稀疏矩阵这道题则一直在思考、不断提交、不断检查和修改才搞定。

(由于提交的时候有点着急所以忘记截图代码了)

首先我先定义了一个结构体存放非零元素的行数、列数、值作为三元组表的一个表元素(一行),然后又定义了一个结构体表示整个三元组表。一开始定义MAX的时候粗心在500的后面加了个“;”,导致之后无法定义数组的大小为MAX,直到后来交了好多次才反应过来。

 1 #define MAX 500
 2 
 3 typedef struct {//定义一个非零元素
 4 int i;//行数
 5 int j;//列数
 6 int data//非零元素值
 7 }TupNode;
 8 
 9 typedef struct{//定义一个稀疏矩阵
10 int n;//矩阵行数
11 int m;//矩阵列数
12 struct TupNode data[MAX];//定义一个三元组表
13 }SupNode;

由于定义了两个结构体,也没有在定义的时候定义一个简单的数组来表示,所以在输入输出的时候都用了以下形式,然后把自己给绕了进去.而且又因为我太粗心就忘记了要一行输入,所以后来一直导致正常数据和样例的测试点错误。

1 SupNode A;
2 for(int i=0;i<=N;i++)
3 {
4 cin>>A.data[i].i;
5 cin>>A.data[i].j;
6 cin>>A.data[i].data;
7 }

在后续我发现可以不用定义整个稀疏矩阵,只需要定义一个动态三元组数组就可以,从而就能将代码简化很多,可读性也变高了很多。

int main()
{
    int k,m,n,N,flag=0;
    TupNode *A;
    A=new TupNode[MAX];
    cin>>m>>n>>N;
    for(int s=0;s<N;s++)
    {
        cin>>A[s].i>>A[s].j>>A[s].data;
    }

提交了好多次以后又因为粗心发现有个位置的数组下表搞错,然后又导致一次提交部分正确。

最后把所有问题都改正以后终于使答案正确了!!

通过这道题我也总结了几个自己的问题和做题的经验。

1.自己敲代码的时候太粗心,不注意符号、题目要求、下标等等细节。

2.对于三元组的数据结构不熟悉,容易多走弯路。

3.自己的唯一优点:在检测k值不存在测试点的时候一次就能过。由此我也发现了立一个flag的好处和小技巧。设立标志对于判断值是否存在、是否输入输出完毕有着重要帮助的作用。

对于上次制定的目标,我还是没能做到提前完成作业,但笔记的整理一直在进行。希望接下来多阅读代码,打好基础,增强自己的编程能力。