题目链接:https://www.nowcoder.com/questionTerminal/67df1d7889cf4c529576383c2e647c48
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符
实例
输入:
e:\1\aa3.txt 3 e:\3\aa1.txt 2 e:\2\aa2.txt 3 e:\3\aa1.txt 1 e:\1\aa1.txt 3 e:\3\aa1.txt 2 e:\1\aa3.txt 3 e:\2\aa3.txt 2 e:\1\aa1.txt 2 e:\3\aa3.txt 2
e:\1\aa2.txt 2 e:\1\aa3.txt 1 e:\1\aa3.txt 1 e:\2\aa3.txt 2 e:\1\aa2.txt 1 e:\3\aa1.txt 2 e:\1\aa1.txt 3 e:\2\aa1.txt 1 e:\3\aa3.txt 2 e:\1\aa1.txt 1
e:\2\aa2.txt 2 e:\3\aa3.txt 2 e:\1\aa2.txt 1 e:\1\aa3.txt 2 e:\1\aa3.txt 3 e:\1\aa2.txt 3 e:\3\aa1.txt 3 e:\2\aa2.txt 2 e:\1\aa1.txt 1 e:\2\aa3.txt 1
e:\3\aa1.txt 1 e:\2\aa1.txt 3 e:\3\aa3.txt 2 e:\1\aa3.txt 3 e:\2\aa3.txt 3 e:\1\aa2.txt 3 e:\2\aa2.txt 1 e:\1\aa3.txt 1 e:\1\aa3.txt 1 e:\3\aa3.txt 3
e:\3\aa3.txt 2 e:\1\aa2.txt 3 e:\1\aa2.txt 3 e:\1\aa2.txt 3 e:\1\aa1.txt 1 e:\2\aa3.txt 1 e:\3\aa3.txt 1 e:\2\aa3.txt 2 e:\3\aa1.txt 3 e:\2\aa2.txt 2
e:\2\aa2.txt 2 e:\2\aa3.txt 1 e:\1\aa3.txt 3 e:\3\aa1.txt 2 e:\3\aa2.txt 2 e:\1\aa2.txt 1 e:\2\aa2.txt 1 e:\2\aa1.txt 2 e:\2\aa2.txt 1 e:\1\aa2.txt 1
e:\2\aa3.txt 1 e:\2\aa2.txt 1 e:\2\aa1.txt 2 e:\3\aa2.txt 3 e:\3\aa1.txt 3 e:\2\aa2.txt 3 e:\2\aa3.txt 1 e:\3\aa3.txt 2 e:\2\aa3.txt 1 e:\1\aa1.txt 2
e:\3\aa3.txt 1 e:\3\aa1.txt 1 e:\2\aa2.txt 3 e:\3\aa3.txt 2 e:\2\aa1.txt 3 e:\1\aa3.txt 3 e:\3\aa2.txt 1 e:\2\aa1.txt 3 e:\1\aa3.txt 3 e:\2\aa2.txt 2
e:\1\aa1.txt 2 e:\3\aa1.txt 1 e:\1\aa3.txt 1 e:\3\aa1.txt 2 e:\1\aa1.txt 2 e:\1\aa1.txt 3 e:\3\aa1.txt 1 e:\3\aa1.txt 1 e:\2\aa3.txt 3 e:\2\aa2.txt 1
e:\2\aa1.txt 2 e:\2\aa2.txt 1 e:\3\aa2.txt 3 e:\1\aa2.txt 1 e:\3\aa2.txt 2 e:\2\aa1.txt 1 e:\2\aa3.txt 3 e:\1\aa1.txt 2 e:\1\aa1.txt 1 e:\1\aa1.txt 2
输出:
aa1.txt 2 14 aa3.txt 1 13 aa1.txt 1 12 aa2.txt 1 12 aa3.txt 3 11 aa3.txt 2 11 aa2.txt 3 10 aa1.txt 3 9
代码:
#include<iostream>
#include<string.h>
#pragma warning(disable:4996);
using namespace std;
struct file_HW {
char name[17]; // 处理后的名字
char in_name[30]; // 输入的名字
int line; // 行号
int error_num; // 出错次数
int time; // 出现时间
};
void swap(file_HW *a, file_HW *b){
file_HW *c;
c = a;
a = b;
b = c;
}
int main(){
int i,j, len, flag, num;
char name_buffer[30];
struct file_HW input, max_ten[30];
//init
for (i = 0; i < 30; i++) {
max_ten[i].error_num = 0;
}
num = 100;
while (num--) {
cin >> input.in_name >> input.line;
len = strlen(input.in_name);
j = 0;
for (i = 0; i < len; i++) // 输入预处理
if (input.in_name[i] == '\\') {
j = 0;
name_buffer[0] = '\0';
}
else {
name_buffer[j] = input.in_name[i];
name_buffer[++j] = '\0';
}
len = strlen(name_buffer);
if (len > 16)
for (i = 0; i < 16; i++)
input.name[i] = name_buffer[len - 16 + i];
else
for (i = 0; i < len; i++)
input.name[i] = name_buffer[i];
input.name[i] = '\0';
for (i = 0; i < 30; i++) { //operation
if (max_ten[i].error_num == 0) { //初次输入
strcpy(max_ten[i].name, input.name);
max_ten[i].line = input.line;
max_ten[i].error_num ++;
max_ten[i].time = num;
break;
}
if (strcmp(max_ten[i].name, input.name) == 0 && max_ten[i].line == input.line) { // 非初次输入
max_ten[i].error_num++;
flag = i;
while (max_ten[flag].error_num > max_ten[flag - 1].error_num && flag > 0) { // 大小原因改变顺序
swap(max_ten[flag], max_ten[flag - 1]);
flag--;
}
while (max_ten[flag].error_num == max_ten[flag - 1].error_num && flag > 0 && max_ten[flag].time > max_ten[flag - 1].time) { // 时间原因改变顺序
swap(max_ten[flag], max_ten[flag - 1]);
flag--;
}
break;
}
}
}
j = 0;
while (max_ten[j].error_num != 0 && j < 8) { // 输出
i = 0;
while (max_ten[j].name[i] != '\0')
cout << max_ten[j].name[i++];
cout << ' ' << max_ten[j].line << ' '<< max_ten[j].error_num << endl;
j++;
}
return 0;
}
步骤分析:
- 数据预处理
- 判断输入类型:首次输入3 or 已有错误4
- 初始化数据结构
- 增大错误次数,并且调整次序