標籤:
題目:簡單錯誤記錄
題目描述:
開發一個簡單的錯誤記錄功能模組,能夠記錄出錯的代碼所在的檔案名稱和行號。
處理:
1、記錄最多8條錯誤記錄,迴圈記錄,對相同的錯誤記錄(淨檔案名稱和行號完全符合)只記錄一條錯誤,錯誤計數增加;
2、超過16個字元的檔案名稱,只記錄檔案的最後有效16個字元;
3、輸入的檔案可能帶路徑,記錄檔案名稱不能帶路徑
輸入描述:
一行或多行字串。每行包括帶路徑檔案名稱,行號,以空格隔開。
檔案路徑為windows格式
如:E:\V1R2\product\fpgadrive.c 1325
輸出描述:
將所有的記錄統計並將結果輸出,格式:檔案名稱程式碼數數目,一個空格隔開,如: fpgadrive.c 1325 1
結果根據數目從多到少排序,數目相同的情況下,按照輸入第一次出現順序排序。
如果超過8條記錄,則只輸出前8條記錄.
如果檔案名稱的長度超過16個字元,則只輸出後16個字元
輸入例子:
E:\V1R2\product\fpgadrive.c 1325
輸出例子:
fpgadrive.c 1325 1
題目分析:
①題目首先比較每次錯誤,如果相同我們只需要記錄一次錯誤,但是錯誤計數要加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#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;}
轉自:http://m.blog.csdn.net/blog/to_xidianhph_youth_2010/37419629
看了好多實現錯誤記錄功能的例子,這篇寫的是最基礎的。。大牛好厲害(我太菜了。。)。
[轉]錯誤記錄