acm--统计错误数
题目描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
文件路径为windows格式
如:E:\V1R2\product\fpgadrive.c 1325
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符
输入例子:
E:\V1R2\product\fpgadrive.c 1325
输出例子:
fpgadrive.c 1325 1
c++源码
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 8 class Error{ 9 public: 10 string error; 11 int count; 12 Error(string e){ 13 error=e; 14 count=1; 15 16 } 17 18 void print_err(){ 19 int index = error.find(' '); 20 if(index>16) 22 cout<<error.substr(index-16)<<" "<<count<<endl; 23 else 25 cout<<error<<" "<<count<<endl; 26 } 27 }; 28 29 bool comp(Error a,Error b){ 30 return a.count>b.count; 31 } 32 /* 测试的样例 33 E:\V1R2\product\fpgadrivea.c1111 1325 34 E:\V1R2\product\fpgadrivea.c11112 125 35 E:\V1R2\product\fpgadrive.c 1325 36 E:\V1R2\productss\fpgadrive.c 1325 37 E:\V1R2\product\fpgadrivea.c11112 1335 38 */ 39 int main(){ 40 41 string str; 42 string file; 43 vector<Error> vet; 44 while(getline(cin,str)){ 46 int index = 0; 47 index = str.rfind('\\'); 48 file=str.substr(index+1); 49 Error e= Error(file); 51 vet.push_back(e); 53 for(int i=0;i<vet.size()-1;i++){ 54 if(vet[i].error==file){ 55 vet[i].count++; 56 vet.pop_back(); 57 break; 58 } 59 60 } 61 62 } 63 64 65 stable_sort(vet.begin(),vet.end(),comp); 66 int i; 67 for(i=0;i<8&&i<vet.size();i++){ 68 vet[i].print_err(); 70 } 71 return 0; 72 }
知识点补充:
1.sort()与stable_sort() 都包含在 algorithm 头文件中,使用时,必须先包含algorithm。
这两个函数的原理都是使用快速排序,时间复杂度在所有的排序中最低,为O(nlog2N);
sort的应用:
sort可以传入两个参数:
sort(a,a+N),其中a是数组,a+N表示数组的结尾,其含义是对a[0] 和a[n]之间的N 个数进行排序(默认从小到大)
stable_sort可以传入三个参数
stable_sort(a,a+N,comp),第三个参数为一个函数。
如果想让算法从大到小排序,可以修改comp函数
bool comp(int a,int b){return a>b;}
stable_sort(a,a+n,comp);
stable_sort的用法和sort一致,区别是stable_sort()函数遇到两个数相等的时候,不对其交换顺序。这个应用在数组里面不受影响,当函数参数传入的是结构体时,会发现两者之间的明显区别。