本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧。
首先分析下题目思路:
这个题目是个模拟题,步骤也很清晰。
首先需要每行读入,将论文的名字,序号,与被引数放到一个结构体里,同时需要一步处理:将文章名称分为关键字存储。
然后程序进行一次排序,以被引数为第一关键字,以号数为第二关键字排序。
排序之后,按照类似方式读入查询命令,将查询命令分为不同关键字,将这些关键字挨着与论文关键字比较,相同即可输出。
按照这些步骤就可以写出靠谱的代码了,结果我还是wa了三次。。
先上代码,收获就放后面,可忽略。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 typedef struct record 5 { 6 int num; 7 int count; 8 int keyL; 9 char name[300]; 10 char afname[300]; 11 char key[11][21]; 12 }Record; 13 Record rec[1001]; 14 Record qy; 15 int divide(char a[],char b[11][21],int n) 16 { 17 int cur=0,j=0; 18 for(int i=0;i ='A') 59 { 60 b[ii]=char(a[ii]+32); 61 } 62 else 63 b[ii]=a[ii]; 64 } 65 66 } 67 int main() 68 { 69 int T,i; 70 while(scanf("%d",&T)) 71 { 72 if(T==0)break; 73 memset(rec,0,sizeof(Record)*T); 74 getchar(); 75 for(i=0;i
代码方面这是第一次全用C写的结构体+重载比较函数构成的多关键字排序,(之前常用C++),
第一次碰到读入一行的问题,解决方法是在用scanf读入之后,要用getchar+gets配合,
第一次处理memset多组初始化问题memset(rec,0,sizeof(Record)*T);+memset(&qy,0,sizeof(Record));配合使用。
其他的一些辅助函数用来模拟的就不值一提了。
非代码方面,这题大体思路昨晚已经有了,但wa了两次,在不知道错误原因的情况下担心wa之后是TLE,所以当时有点心灰意冷,其实最近也一直很忐忑,面试的通知一直没下来,今天妹妹升学宴又出去一天,可晚上回来没想到只用了半小时就调了两个bug出来,而且A了这个少有人问津的题目。虽然心中依然忐忑,依然对未知的错误充满恐惧,但是我相信会好起来的。
---一个事情,自己找不到原因,非常可怕。