标签:测试 编程 div display 小结 htm 三元 bool 遇到
数据结构第四章 主要学习了串和数组。在本章学习中让我印象最深和最折磨我的就是,稀疏矩阵和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 {//删除前面都是空格的情况 对应第一个非空格的字符 字符串结尾有一个‘\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核心代码的过程中我学到了怎么将空格 回车输入到字符串
.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很难 而且感觉学的不踏实 还是要尝试一下。下一章还要继续努力 希望能够所有编程题都全部正确
标签:测试 编程 div display 小结 htm 三元 bool 遇到
原文地址:https://www.cnblogs.com/snowlxy/p/10703851.html