第四章学习小结

数据结构第四章 主要学习了串和数组。在本章学习中让我印象最深和最折磨我的就是,稀疏矩阵和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     {//删除前面都是空格的情况 对应第一个非空格的字符 字符串结尾有一个'\0',所以即使字符串全空,到最后结尾符也会停止循环 
 41 }
 42     //从s的第一个非空字符开始,逐个扫描,分情况复制到t
 43     while(s[i]!='\0')
 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] = '\0';//为t串末尾增加结尾符 
 79     
 80     j=0;
 81     while(t[j]!='\0')
 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()会在数组结尾是'\0',getline()不会
具体想了解更多 可以看
http://www.cnblogs.com/shrimp-can/p/5241544.html

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

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

然而 一直显示格式错误 

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

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

 

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

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

 

posted on 2019-04-14 02:26  流星雨lxy  阅读(160)  评论(1编辑  收藏  举报

导航