您的位置:首页 > 其它

华为OJ(简单错误记录)

2015-08-27 19:27 246 查看
描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:  1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加; 2、 超过16个字符的文件名称,只记录文件的最后有效16个字符; 3、 输入的文件可能带路径,记录文件名称不能带路径。

知识点字符串
运行时间限制0M
内存限制0
输入一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

如:E:\V1R2\product\fpgadrive.c 1325

输出将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

fpgadrive.c 1325 1

样例输入E:\V1R2\product\fpgadrive.c 1325
样例输出fpgadrive.c 1325 1
因为要求记录数不超过8个,循环计数,因此采用queue队列,超过8个,则对首pop,用map对每个键值计数。问题还真是多啊,最后还是都解决了。感觉对整个程序流程把握很重要!
<pre name="code" class="cpp">#include<iostream>
#include<queue>
#include<map>
#include<string>
using namespace std;
int main()
{
string s,tmp,line;
map<string,int> imap;
queue<string> sq;
int posleft,posright,len,spaceleft;
while(cin>>s>>line)
{
posleft=s.find_last_of('\\');
s=s.substr(posleft+1);	//将文件名求出
len=s.size();
if(len>16)
tmp=s.substr(len-16,16)+" "+line;
else
tmp=s.substr(0,len)+" "+line;
imap[tmp]++;
if(imap[tmp]==1)
sq.push(tmp);
if(sq.size()>8)
//imap.erase(sq.front());问题出在这
sq.pop();

}

while(!sq.empty())
{
cout<<sq.front()<<" "<<imap[sq.front()]<<endl;
sq.pop();
}
//system("pause");
return 0;
}



下面基于未封装的类是OJ下面别的同学实现的,感觉体现了C++的类的思想,挺好的,也贴出来跟大家分享:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

class record
{
public:
string name;
int line;
int count;
record()
{
count = 1;
name = "";
line = -1;
}
void setName();
bool query( record q );
void output();
};
void record::setName()
{
int pos = name.find( '\\') ;
while( pos != string::npos )
{
name.erase( 0, pos + 1 );

pos = name.find( '\\' );

}//end while
}//end setName

bool record::query( record q )
{
if( q.name == name && q.line == line )
return true;

return false;

}//end queryName

void record::output()
{
int temp = name.length();

//cout<<name.substr( temp - 16,16 )<<" "<<line<<" "<<count<<endl;
if( name.length() <= 16 )
cout<<name<<" "<<line<<" "<<count<<endl;
else
cout<<name.substr( temp - 16,16 )<<" "<<line<<" "<<count<<endl;

}
//end output

int main()
{

vector<record> input;
string inputname;
int line;
while( cin>>inputname>>line )
{
//cin>>inputname>>line;
record temp;
temp.name = inputname;
temp.line = line;
temp.setName();

if( !input.empty() )
{
bool query = false;

for( int i = 0; i < input.size(); i++ )
if( input[ i ].query( temp ) )
{
query = true;
input[ i ].count++;
break;
} //end if

if( !query )
input.push_back( temp );

}//end if
else
{
input.push_back( temp );
}//end else

}//end while

if( input.size() <= 8 )
{
for( int i = 0; i < input.size(); i++ )
input[ i ].output();
}//end if
else
{
for( int i = input.size() - 8; i < input.size(); i++ )
input[ i ].output();
}//end else

//system( "pause" );
return 0;
}//end main
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: