2012-08-13 57 views
2

的最小數我有以下形式的一組數據:找到一組數據

a1 b1 c1 d1 
a2 b2 c2 d2 
... 
an bn cn dn 

我的目標是要找到具有爲C列的值最小的行。

我做了以下內容:

const int limit=100000; 
float Array[limit][4]; 

int main() { 

    double a, b, c, d, smallest, ref1, ref2; 

    ifstream in("data.dat"); 

    int idx=-1, point; 

    while(!in.eof()) { 

    idx++; 
    in >> a >> b >> c >> d; 

    Array[idx][0]=a; Array[idx][1]=b; Array[idx][2]=c; Array[idx][3]=d; 

} \\end of while 

in.close(); 


    int count=idx; 

    for(int i=1; i<count; i++) { 

     ref1= Array[0][2]; 
     ref2 = Array[i][2]; 

     if(ref2 < ref1) {ref1 = ref2; point=i;} //I thought this will save the smallest value 

     smallest = ref1; point= i; 

} \\end for 


cout << "point" << Array[point][0] << Array[point][1] << .. etc. 

return 0; 

} 

但是,輸出是在數據的最後一個點。 (至於輸入這個問題,我意識到當新行被讀取時,ref1將始終是Array [0] [2]。所以現在我完全失去了!)

如何保存一個點作爲參考點,以便將其與其餘數據進行比較,並且每次將其與較小的點進行比較時,它會變爲較小的值?

UPDATE:我通過考慮ref1 = Array [0] [2];出於for循環。

+0

您使用'count'沒有被初始化。但是我沒有得到你所問的問題,你能再解釋一下嗎? – 2012-08-13 13:51:52

+0

你是否檢查你是否正確讀取文件? – jrok 2012-08-13 13:52:28

+0

你在每一個for循環中設置'point = i',不管是否它是最小或不是。刪除它 – acraig5075 2012-08-13 13:57:40

回答

3

你應該設定一個參考,因爲我做外循環和更新雙打但是這裏最小的,順便說一句,不要混用彩車是一個示例代碼:

#include <iostream> 
#include <fstream> 

using namespace std; 


const int limit=100000; 
float Array[limit][4]; 

int main() { 

    double a, b, c, d, smallest, ref1, ref2; 

    ifstream in("data.dat"); 

    int idx=-1, point; 

    while(!in.eof()) { 

    idx++; 
    in >> a >> b >> c >> d; 

    Array[idx][0]=a; 
    Array[idx][1]=b; 
    Array[idx][2]=c; 
    Array[idx][3]=d; 
    } //end of while 

    in.close(); 
    int i = 0; 
    int count; 
    smallest = Array[i][2]; 
    for(i=1; i<count; i++) { 
    ref2 = Array[i][2]; 

    if(ref2 < smallest) { 
     smallest = ref2; 
     point=i; 
    } 
    } 

    std::cout << "point" << Array[point][0] << " " 
      << Array[point][1] << " " 
      << Array[point][2] << " " 
      << Array[point][3] << std::endl; 

return 0; 

} 

隨着數據文件

1 2 3 4 
2 3 8 9 
1 3 5 2 
1 1 1 1 
2 4 2 4 
3 1 0 1 

HTH

+0

謝謝,這就是我所做的,我得到了正確的結果。 – stupidity 2012-08-13 14:21:06

+0

好吧,你可能會把答案當作「接受」來回答;-) – 2012-08-13 15:06:36

3

要證明你已經發現了一組值的最小值,改變你的for循環以下幾點:

int smallest_val = std::numeric_limits<int>::max(); 

for(int i=0; i < idx; i++) 
{ 
    if (Array[i][2] < smallest_val) 
     smallest_val = Array[i][2]; 
} 

基本上通過設置smallest_val以最大的可能值,它開始可以使用std::numeric_limits<int>::max()。現在陣列中的每個值必須至少與smallest_value一樣大或更小(沒有什麼可以更大)。在循環訪問數組時,一旦您的值小於smaller_value中的當前值,您將正確地將smaller_value中的值重新分配給該新的較低值。通過以int類型表示的儘可能大的可能性開始,可以避免遇到的問題,即最小值相對於彼此的位置。使用數學歸納法,這種類型的方法對於你在這裏要做的事情是不必要的。

+0

謝謝你的回答。我也修復它通過考慮1循環。 – stupidity 2012-08-13 14:19:31

0

這裏的問題是,你永遠不會比你最小。您可以在ref1和ref2之間分配最低值,而不考慮先前的迭代。此外,ref1始終是數據中的第一個值,所以如果最後一個值大於第一個值,最小值始終是最後一個值。將循環更改爲Jason發佈的內容可以解決您的問題。

1

在不同的音符,輸入迴路控制不正確:

while(!in.eof()) { 

直到讀取失敗,纔會觸發eof()。在實踐中,這意味着輸入循環會執行一次額外的時間,並且在上次通過時會得到無意義的值。

正確的測試是

while(in >> a >> b >> c >> d) { 

如果有任何提取的失敗,(希望因爲in是在輸入的結束,while循環將結束。

+0

我想,在這種情況下,做一個雖然是更好的選擇... ...做某事{...} while(in)if我是對的... – 2012-08-13 15:25:49

+0

不,不是一會兒。只是一會兒。但它應該是'while(in >> a >> b >> c >> d)',而不是'while(!in)',這正是我最初寫的。 – 2012-08-13 16:08:11

+0

對,我沒有看到你的味精的第二部分... – 2012-08-13 17:02:41