第四章学习小结

Posted snowlxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章学习小结相关的知识,希望对你有一定的参考价值。

数据结构第四章 主要学习了串和数组。在本章学习中让我印象最深和最折磨我的就是,稀疏矩阵和AI的那道题。

稀疏矩阵,虽然在老师讲了三元组法后,前面都写的很顺畅,但是我卡在了最后一步,一下是我的代码过程

技术图片
 1 #include<iostream>
 2 using namespace std; 
 3 
 4 //将非零元素的行列号以及数值定义为一个结构体
 5 typedef struct
 6 {
 7     int r;//第r行
 8     int c;//第v行
 9     int v;//第r行第v列的值 
10 }node;
11 
12 //将非零元素的结构体与非零元素的个数也定义成一个结构体 变成一个包
13 typedef struct
14 {
15     node a[500];
16     int length;//矩阵中非零元素的个数
17      
18 }Tuple;
定义元组

定义完元组后,接下来是主函数

技术图片
 1 int main()
 2 {
 3     Tuple q;
 4     
 5     int m,n,N;//m,矩阵行数,n,矩阵列数,N,矩阵的非零元素个数 
 6     cin>>m>>n>>N;
 7     
 8     q.length=N;
 9 
10     for(int i=0;i<q.length;i++)
11     {
12         cin>>q.a[i].r;//输入非零元素所在行,列号和非零元素的值 
13         cin>>q.a[i].c;
14         cin>>q.a[i].v;    
15     } 
16          
17     int k; 
18     cin>>k;//输入查询数据
19     
20     if(k!=0)
21     {
22         for(int i=0;i<q.length;i++)
23     {
24         if(q.a[i].v == k)
25         {
26             cout<<q.a[i].r<<" ";
27             cout<<q.a[i].c; 
28         }
29         else 
30         {
31         i++;
32         if(q.a[i].v != k&&i>q.length-1) cout<<"ERROR";
33         else continue;
34         }
35 
36     }
37     }
38     return 0;
39  } 
main 函数

虽然这次显示了全部答案正确

技术图片

但是在经历最后一个测试点正常数据时经历了很多折磨

 1     if(k!=0)
 2     {
 3         for(int i=0;i<q.length;i++)
 4     {
 5         if(q.a[i].v == k)
 6         {
 7             cout<<q.a[i].r<<" ";
 8             cout<<q.a[i].c; 
 9         }
10         else
11         {
12             if(i !=q.length-1)
13             {
14                 i++;
15                 continue;
16             }
17             else cout<<"ERROR";
18         }
19 
20     }
21     }

刚开始的想法是当k在矩阵中不存在的话,此时如果还没有到最后一个非零元素 ,i就需要++ ,当到了最后一个非零元素了,k还是不存在的话就输出“ERROR”

但是最后一个测试点一直通不过

技术图片

后来又改了好多次

错误1:    if(k!=0)
    {
        for(int i=0;i<q.length;i++)
    {
        if(q.a[i].v == k)
        {
            cout<<q.a[i].r<<" ";
            cout<<q.a[i].c; 
        }
        if(i==q.length-1) cout<<"ERROR";
                else i++;
  
    }
    }   

错误2:
 if(k!=0)
    {
        for(int i=0;i<q.length;i++)
    {
        if(q.a[i].v == k)
        {
            cout<<q.a[i].r<<" ";
            cout<<q.a[i].c; 
        }
        else
        {   
          if(i !=q.length-1) 
      {
        i++;
        continue;
      }
if(i==q.length-1) cout<<"ERROR"; } }

甚至运用bool函数 都未能解决这个问题 其中有思考过是不是我continue 和break没有用错了

还百度巩固了一下continue和break的区别

技术图片

 

 最后反应过来

 1     
 2     if(k!=0)
 3     {
 4         for(int i=0;i<q.length;i++)
 5     {
 6         if(q.a[i].v == k)
 7         {
 8             cout<<q.a[i].r<<" ";
 9             cout<<q.a[i].c;
10         }
11         
12         if( (q.a[i].v != k) && (i == q.length-1))
13             cout<<"ERROR";
14         
15         else i++;
16     
17     }
18     }

要输出“ERROR”是要在 k的值不存在并且 i已经到了q.length-1的情况下 ,并且&&前后顺序不能调换 也就是说 要必须是最后一个非零元素仍然与k不相等,此时才输出“ERROR”

下面是完整的代码

技术图片
 1 #include<iostream>
 2 using namespace std; 
 3 
 4 typedef struct
 5 {
 6     int r;//第r行
 7     int c;//第v行
 8     int v;//第r行第v列的值 
 9 }node;
10 
11 typedef struct
12 {
13     node a[500];
14     int length;//矩阵中非零元素的个数
15      
16 }Tuple;
17 
18 int main()
19 {
20     Tuple q;
21     
22     int m,n,N;//m,矩阵行数,n,矩阵列数,N,矩阵的非零元素个数 
23     cin>>m>>n>>N;
24     
25     q.length=N;
26 
27     for(int i=0;i<q.length;i++)
28     {
29         cin>>q.a[i].r;//输入非零元素所在行,列号和非零元素的值 
30         cin>>q.a[i].c;
31         cin>>q.a[i].v;    
32     } 
33          
34     int k; 
35     cin>>k;//输入查询数据
36     
37     if(k!=0)
38     {
39         for(int i=0;i<q.length;i++)
40     {
41         if(q.a[i].v == k)
42         {
43             cout<<q.a[i].r<<" ";
44             cout<<q.a[i].c;
45         }
46         
47         if( (q.a[i].v != k) && (i == q.length-1))
48             cout<<"ERROR";
49         
50         else i++;
51     
52     }
53     }
54 
55  } 
完整代码

 

AI核心代码:

技术图片
  1 #include<iostream>
  2 #include<string>
  3 #include<cstring> 
  4 #include<cstdio>
  5 
  6 using namespace std;
  7 
  8 void go(string s);
  9 bool isSeparator(char ch);
 10 
 11 
 12 int main()
 13 {
 14     string s;
 15     int N,i;
 16     cin >> N;//第一行给出不超过10的正整数N 
 17     getchar();//吸收回车符,以回车来结束用户的对话 ,遇到回车就不继续往下读 
 18     for(i=1;i<=N;i++)
 19     {
 20         getline(cin,s);//可以接收空格和回车,空格和回车也是string内的字符 
 21         cout<< s <<endl;
 22         cout << "AI: ";
 23         go(s);//AI根据s输出对话 
 24      }                                                 
 25     
 26     return 0; 
 27     
 28  } 
 29  
 30 void go(string s)
 31 {
 32     
 33     char t[3002];//注意输入全部是I的时候,输出长度是输入的三倍 
 34     //string t
 35     
 36     int i,j=0;//i,j分别表示s,t的下标
 37     
 38     //i定位到s的第一个非空字符
 39     for(i=0;s[i]== ;i++)
 40     {//删除前面都是空格的情况 对应第一个非空格的字符 字符串结尾有一个‘‘,所以即使字符串全空,到最后结尾符也会停止循环 
 41 }
 42     //从s的第一个非空字符开始,逐个扫描,分情况复制到t
 43     while(s[i]!=)
 44     {
 45         //扫描第一个非空字符s[i] 
 46         if(s[i]==  && s[i-1]== )//当两个单词中间不止一个空格时 
 47         {
 48             i++;//防止死循环 
 49             continue;
 50         }
 51         
 52         //将字符串中的?替换成! 
 53         if(s[i] ==?)
 54         {
 55             t[j] = !;
 56             i++;
 57             j++;
 58             continue;
 59         }
 60         
 61         //将字符串中的除了"I" 以外,所有大写字母替换成小写字母
 62         if(s[i] != I)
 63         {
 64             t[j] = tolower(s[i]);
 65             i++;
 66             j++;
 67         } 
 68         
 69         else
 70         {
 71             t[j] = s[i];//将s串的非空或者单个空格给到t串, 之后分别+1进行下一轮输入 
 72             j++;
 73             i++; 
 74         }
 75         
 76      } 
 77     
 78     t[j] = ;//为t串末尾增加结尾符 
 79     
 80     j=0;
 81     while(t[j]!=)
 82     {//独立的I证明左右均为分割符 
 83         if(t[j]==I && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+1]) )//"I"独立 没有被其他分割符分割开 
 84         {
 85             cout<< "you";
 86             j++;
 87             continue;
 88         }
 89         
 90         //独立的"me" 
 91         if(t[j]==m && t[j+1]==e && (j==0 || isSeparator(t[j-1])) && isSeparator(t[j+2]))
 92         {
 93             cout<< "you";
 94             j +=2;
 95             continue;
 96         }
 97          
 98          //空格的下一个是标点,不输出
 99 
100         
101             
102         if(t[j]==c && t[j+1] ==a && t[j+2] ==n && t[j+3] ==   && t[j+4] ==y && t[j+5] ==o && t[j+6] ==u&&(j==0||isSeparator(t[j-1])) && isSeparator(t[j+7]))
103         {//把所有独立的can you 替换成I can
104             cout<<"I can";
105              j +=7;
106              continue;
107             
108         }
109         
110         if(t[j]==   && isSeparator(t[j+1]))
111         {
112         j++;
113         continue; 
114         }
115         cout<<t[j];
116         j++; 
117     
118     }
119     cout<<endl;
120 }
121 
122 bool isSeparator(char ch)
123 {
124     ch = tolower(ch);
125     if((ch>=0 && ch<=9 )|| (ch>=a && ch <=z ))
126         return false;//对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号,此时不是分隔符,返回false 
127     else
128         return true; //其他情况是分割符 
129 }
130 
131 
132 
133  
AI核心代码完整

在编写AI核心代码的过程中我学到了怎么将空格 回车输入到字符串

.getline()
用于string类的。使用需包含头文件#include<string>。getline(cin,string s),接收一个字符串,可以接收空格、回车等
与cin.getline()的区别:1.cin.getline()接收输入字符串的是数组,getline()是string类型。
                                    2.cin.getline()可以接收空格,但不能接收回车;getline()可以接收空格和回车
                                    3.cin.getline()会在数组结尾是,getline()不会
具体想了解更多 可以看
http://www.cnblogs.com/shrimp-can/p/5241544.html

刚开始 总是不成功 后来我发现了一个东西

技术图片

刚开始我是没有在for后面加{}的,我以为只是一个循环 ,将字符串前面的空格全部跳过 直接定位到第一个非零元素

然而 一直显示格式错误 

好了 翻了C++书 终于知道自己的C++是有多差了

技术图片

for循环后面一定要跟有语句 最后就全部正确啦

 

通过这一章做这三道编程题 我觉得我还是收获满满 虽然在写模式匹配和AI的时候,参考了很多老师的代码 但是还是自己一个个专研 把代码看懂 并且巩固了很多以前的知识也扩充的不懂的点

上章作业做完我希望自己能够不满足把题目编程出来 而且要每个测试点都弄对 这次有两道题都成功的全部正确 只差最后一道 模式匹配的最后一个测试点不成功 成功的两道题我也没想到我会全部正确 没想到自己真的刚在那里几个小时 最后终于把他弄出来 算是自己的一个很大的成长,虽然模式匹配最后一个测试点还是不行,我希望就算pta的ddl过了 自己还是能够继续研究 听老师说最后一个测试点要用kmp 虽然kmp很难 而且感觉学的不踏实 还是要尝试一下。下一章还要继续努力 希望能够所有编程题都全部正确技术图片

 

以上是关于第四章学习小结的主要内容,如果未能解决你的问题,请参考以下文章

第四章学习小结

第四章 学习小结

第四章学习小结

DS第四章学习小结

第四章学习小结 串的模式匹配 解题心得体会

第四章学习小结心得