题目
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
文件路径为windows格式
如:E:\V1R2\product\fpgadrive.c 1325
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符
示例1
输入
E:\V1R2\product\fpgadrive.c 1325
输出
fpgadrive.c 1325 1
思路
实际思路很容易,就是把文件名和行号取出来,统计并排序,难点都是细节。
需要注意以下几点:
1.找文件名,判断\,注意转移字符写成’\\’。
2.超过16个字符,只输出16个字符,分情况处理文件名:当文件名小于16个字符,直接输出;否则,输出倒数16个字符。
3.要求统计文件名出现的个数从大到小排列,可以单独开辟一个数组存储每个文件名出现的次数。
4.排序时,数目相同的情况下,按输入第一次出现的顺序排序,因此再开辟一个数组存储文件名的出现顺序。
5.最后输出前要判断记录的条数,只取前8条。
代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
void swap(vector<string> &errors,vector<int> &nums,vector<int> &locals,int i,int j)
{
string tmpString;
int tmpInt;
tmpInt = nums[i];
nums[i] = nums[j];
nums[j] = tmpInt;
tmpString = errors[i];
errors[i] = errors[j];
errors[j] = tmpString;
tmpInt = locals[i];
locals[i] = locals[j];
locals[j] = tmpInt;
}
int main()
{
string s;
vector<string> errors;
vector<int> nums;
vector<int> locals;
int local=0;
while(getline(cin,s))
{
if (s.size()==0)
{
break;
}
string file;
int i;
int count=0;
int temp;
for(i=0;i<s.size();i++)
{
if(s[i]=='\\')
temp=i;
if(s[i]==' ')
{
break;
}
}
if(i-temp>16)
temp=i-17;
for(int j=temp+1;j<i;j++)
{
file+=s[j];
}
for(;i<s.size();i++)
{
file+=s[i];
}
if(!errors.size())
{
count++;
locals.push_back(local);
nums.push_back(count);
errors.push_back(file);
local++;
continue;
}
int flag=0;
for(int i=0;i<errors.size();i++)
{
if(file==errors[i])
{
nums[i]++;
for(int p=0;p<i;p++)
{
if(nums[i]>nums[p])
{
swap(errors,nums,locals,i,p);
break;
}
else if(nums[i]==nums[p])
{
if(locals[i]<locals[p])
swap(errors,nums,locals,i,p);
}
}
flag++;
break;
}
}
if(!flag)
{
count++;
locals.push_back(local);
nums.push_back(count);
errors.push_back(file);
local++;
}
}
for(int i=0;i<errors.size()-1;i++)
{
for(int j=i+1;j<errors.size();j++)
{
if(nums[i]==nums[j])
{
if(locals[i]>locals[j])
swap(errors,nums,locals,i,j);
}
else
break;
}
}
int size=errors.size()>8?8:errors.size();
for(int i=0;i<size;i++)
{
cout<<errors[i]<<' '<<nums[i]<<endl;
}
}
|