2013-11-03 81 views
0

我有一個程序,計算兩個程序的代碼行(不包括註釋,大括號,空格等),然後比較它們。它將一個程序的所有行放在一個List中,另一個程序的行放在另一個List中。然後它刪除所有在兩者之間相同的行。一個列表是所有添加到程序1中的行以獲得程序2,另一個列表是從程序1中刪除的所有行以獲得程序2.如何計算修改後的代碼行數?

現在我需要一種方法來檢測程序中有多少行代碼1已經被修改以獲得程序2.我找到了一個Levenshtein距離的算法,看起來好像會起作用。我只需要將距離與字符串的長度進行比較以獲得百分比變化,我需要爲閾值提供一個很好的值。

但是我的問題是這樣的:我怎麼知道哪兩個字符串比較Levenshtein距離?我最好的猜測是有一個嵌套的for循環,並通過一個程序在另一個程序中的每一行循環一次,以比較每條線與其他每條線,尋找滿足差異閾值的距離。但是,這似乎效率很低。有沒有其他的方法來做到這一點?

我應該添加這是一個軟件工程類。這在技術上是家庭作業,但我們可以使用我們需要的任何資源。雖然我只是在尋找算法,但我會告訴你我正在使用C#。

+0

難道你的答案僅僅是兩份名單的總和?列表1中剩下的內容被刪除,並且列表2中的內容被添加。我錯過了什麼嗎?我不知道,定義「代碼行」。 –

+0

一行代碼是具有分號(並且不是註釋)的任何行,以及其他一些行,如方法標題和包含保留字的行,例如while,try等。修改的行是程序中的一行2,它與程序1中的一條線非常相似但不完全相同。 – JDCAce

回答

0

如果你允許行被洗牌,你如何計算更改?即使您比較所有行並找到完全匹配,並非所有的混洗線都可能導致相同的功能。

如果你比較

var random = new Random(); 
for (int i = 0; i < 9; i++) { 
    int randomNumber = random.Next(1, 50); 
} 

for (int i = 0; i < 9; i++) { 
    var random = new Random(); 
    int randomNumber = random.Next(1, 50); 
} 

你有四個不變行代碼,而第二個版本很可能會產生不同的結果。有肯定代碼的變化,但如果你允許洗牌,但逐行比較不會檢測到它。

這是禁止混洗的一個很好的理由,並且實際上將第一個代碼中的第1行標記爲已刪除,並將第2個代碼中的第2行添加,即使刪除的行和添加的行完全相同。

一旦你自殺,線條不能洗牌,我想你可以很容易弄清楚如何配合你的線條進行比較。

要逐步完成兩個源和比較,你可能想看看天平線算法線(例如http://www.isqa.unomaha.edu/haworth/isqa3300/fs006.htm

0

如果您建議將代碼行進行混洗(它們的順序可以更改),那麼您需要比較第一個程序中的所有行和第二個程序中的所有行(不包括未更改的行)。

你可以簡化你的任務,暗示行不能混洗。它們只能插入,移除或不改變。從我的經驗來看,大多數比較文本文件的程序都是這樣工作的

+0

我沒有想過將它限制爲只有非混洗線。我必須決定這是否是我想要的。感謝您的回答和建議! – JDCAce