简单错误记录

时间:2022-03-27 20:06:06

本代码来自网络,参考资料如右链接:https://yq.aliyun.com/articles/3450

主要练习了容器与算法的使用,原代码无法满足机试题的要求,因为题目表述不清,因此对原代码作了小的改动,作了注释

代码

/*---------------------------------------
* 日期:2015-07-02
* 原作者:SJF0115
* 题目:简单错误记录
* 来源:华为机试练习题
* 修改作者:Kaysono012345
* 修改日期:2016-07-19
-----------------------------------------*/

#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
#include<list>
using namespace std;
struct ErrorLog //创建一个数据结构,包含要输出的文件名称、行号与数量
{
string name;
string line;
int count;
};
ErrorLog CreateErrorLog(string name, string line)//根据输入的包括路径的文件名称与行号,创建新的错误记录结构体变量,创建过程中求取目标文件名称
{
ErrorLog log;
int namesize = name.size();
for (int i = name.size(); i >= 0; i--)
{
if (name[i] == '\\')
{
name = name.substr(i + 1);//string.substr的运用,取子字符串
break;
}
}
if (name.size() > 16)//仅取最多16个字符的文件名
name = name.substr(name.size() - 16);
log.name = name;
log.line = line;
log.count = 1;//创建新的记录,表示没有旧的记录存在,因此数量目前为1
return log;//返回结构体变量
}
void RecordErrorLog(int &number, ErrorLog log, vector<ErrorLog> &result)//记录错误,输入量包括一条错误记录,输入输出量包括记录总数量,记录结果(用容器表示,可用数组表示多条记录),两者采用引用
{
bool isRepeat = false;
for (string::size_type i = 0; i < result.size(); ++i)//注意采用 string::size_type i,这样i才能与result.size()比较
{
if (log.name == result[i].name &&log.line == result[i].line)
{
isRepeat = true;
++result[i].count;//如果已存在记录,则对已存在记录的数量变量加1
break;
}
}
if (!isRepeat)//如果为新记录,则根据已存在记录数量,分别加入result中,以下注释的三行是为了配合华为机试题的要求,它的要求是输出最新的8条记录,而非原代码所认为的不重复的从头覆盖原记录的总8条记录
{
//if (result.size() < 8)
result.push_back(log);
/*else*/
//result[number % 8] = log;//注意采用result[number % 8]
number++;
}
}
int main()
{
ErrorLog log;
vector<ErrorLog> result;
string name, line;
int number = 0;
while (cin >> name >> line&& name != "quit")//不知道在VS2013调试命令窗口中应该如何退出循环
{
log = CreateErrorLog(name, line);
RecordErrorLog(number, log, result);
}
if (result.size() <= 8){//该段if代码是配合华为机试题的要求,它的要求是输出最新的8条记录
for (string::size_type i = 0; i < result.size(); ++i)
cout << result[i].name << ' ' << result[i].line << ' ' << result[i].count << endl;
}
else{
for (string::size_type i = result.size() - 8; i < result.size(); ++i)
cout << result[i].name << ' ' << result[i].line << ' ' << result[i].count << endl;
}
/*for (string::size_type i = 0; i < result.size(); ++i)
cout << result[i].name << ' ' << result[i].line << ' ' << result[i].count << endl;*/

//该段注释代码为原代码,输出不重复的从头覆盖原记录的总8条记录
return 0;
}