HWOJ 简单错误记录
题目:简单错误记录
题目描述:
开发一个简单的错误记录功能模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条错误,错误计数增加;
2、超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、输入的文件可能带路径,记录文件名称不能带路径
题目分析:
①题目首先比较每次错误,如果相同我们只需要记录一次错误,但是错误计数要加1;所以我们想到要把每次错误储存在一个二维数组中,这个数组为8行17列store[8][17]
②我们要记录错误计数,因为每个错误可能次数不一样,所以我们也定义一个一维数组counts[i]
③超过16个字符的文件名称,我们只记录文件的最后有效16个字符,所以我们要区分开舒瑞虎的文件名称和行数,所以我们又需要定义一个一维数组保存错误所在行号rows[]
④检测文件名称的长度,我们需要从后往前数,检测/字符,这里需要注意C语言中转义字符用双右斜杠表示转义字符。
⑤我们还需要一个计较每次错误是不是相等,我们可以利用字符串中strcmp来比较,而且行也需要相等,如果是第一次输入时,我们就不需要比较。之后每输入一次都要和前面每一次进行比较。用循环解决
⑥如果不相等,我们就直接将字符串拷贝到store中,用字符串处理strcpy
⑦最后输出格式,由题意可以知道我们这里要输出前面所有的错误,所有我们要采用一个for循环,输出所有的错误。错误中包含store[],rows[],counts[]
学习笔记:
①充分利用数组来完成算法
如果有很多个字符串需要保存,我们需要用字符串数组,二维数组来保存,store[i]表示一个字符串
②充分利用字符串的功能strcpy拷贝和strcmp比较
③注意如果我们知道一个数组的初始地址的时候,我需要表示字符串后面的字符串我们可以这样表示&s[len - 1 -i]。学会这种表示方法
=============================================================================
参考代码:
//简单错误记录.cpp
//2014.7.4
#include <iostream>
#include <string>
using namespace std;
const int maxn = 1000;
char s[maxn];
int main()
{
//初始化
char store[8][17] = {0};
int counts[8] = {0};
int rows[8] = {0};
int row,kase = 0;
//输入
while(cin >> s >> row)
{
int len = strlen(s);
int i;
//只保留最后有效字符16个字符
for(i = 0;i < 16; i++)
{
if(s[len - 1 - i] == '\\')
break;
}
//判断是不是相同
i--;
int equal = 0;
for(int j = 0;j < kase; j++)
{
if(strcmp(store[j],&s[len - 1 -i]) == 0 && row == rows[j])
{
equal = 1;
counts[j]++;
break;
}
}
//如果不相同
if(!equal)
{
strcpy(store[kase], &s[len - 1 -i]);
rows[kase] = row;
counts[kase]++;
kase ++;
}
for(int j = 0; j < kase; j++)
{
cout << store[j] << " " << rows[j] << " " << counts[j] << endl;
}
}
return 0;
}