第四章学习小结
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 }
虽然这次显示了全部答案正确
但是在经历最后一个测试点正常数据时经历了很多折磨
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]!=‘