2017-03-25 45 views
0

我一直在這一整天掙扎,我得到的輸出是正確的,除了中間的結果。如果有人能幫助我,那會很棒。我得到的輸出是用於ID [A]代替ID [C],它似乎是在循環對A中的ID被攜帶至C.C:使用陣列,不斷給我錯誤的輸出

int firstA=0, firstS=0, secondS=0, firstC=0, secondC=0; 

    for (row=0; row<totalSize; row++) { 

     if (category[row]=='A' && ranking[firstA] < ranking[row]) { 
      firstA = row; 

     } 

     if (category[row]=='C' && ranking[firstC] < ranking[row]) { 
      secondC = firstC; 
      firstC = row; 
     } 
     else if (category[row]=='C' && ranking[secondC] < ranking[row]) { 
      secondC = row; 
     } 

     if (category[row]=='S' && ranking[firstS] < ranking[row]) { 
      secondS = firstS; 
      firstS = row; 
     } 
     else if (category[row]=='S' && ranking[secondS] < ranking[row]) { 
      secondS = row; 
     } 


    } 

    printf("A : %d %.2lf \n", id[firstA], ranking[firstA]); 
    printf("C : %d %.2lf \n", id[firstC], ranking[firstC]); 
    printf("C : %d %.2lf \n", id[secondC], ranking[secondC]); 
    printf("S : %d %.2lf \n", id[firstS], ranking[firstS]); 
    printf("S : %d %.2lf \n", id[secondS], ranking[secondS]); 

    return 0; 
} 

輸入文件

10 
14 A 447 252 68 34 978 
2 C 230 299 597 180 9 
27 A 318 220 97 28 1317 
32 C 563 450 547 112 28 
8 C 669 260 200 36 171 
11 S 179 45 1342 732 174 
19 S 74 249 861 1165 6 
21 A 757 240 97 119 2032 
15 S 275 177 588 577 52 
6 C 886 401 327 109 48 

預期輸出

A: 21 1171.00 
C: 6 696.70 
C: 32 578.00 
S: 11 1094.20 
S: 19 1046.50 

的問題是在這裏,我得到這個

A : 21 1171.00 
C : 6 696.70 
C : 14 601.10 
S : 11 1094.20 
S : 19 1046.50 

中間C正在攜帶A之一的ID。我似乎無法弄清楚我的循環中有什麼問題。任何幫助,將不勝感激!

+0

你的第二個等級C從來沒有被分配。這是因爲C的第一個排名是最後一個,因此C的相關if-else語句的第一部分始終爲真,並且您的代碼永遠不會到達else部分(其中secondC被分配)。您會看到A的值,因爲這是您列表中的第一個值(項目0),而secondC仍然設置爲其初始默認值0. – Evert

+0

因此與下面的答案不同,將只是使用所有的if語句而不是其他的? – ZyxyZ

回答

1

秒S被初始化爲0類,即類別'A'。該行的秩小於預期秒排,所以秒保持0。你需要做一些這樣的初始值總是會得到分配到正確的類別,這樣

int firstA=-1, firstS=-1, secondS=-1, firstC=-1, secondC=-1; 

    for (row=0; row<totalSize; row++) { 

     if (category[row]=='A' && (firstA == -1 || ranking[firstA] < ranking[row])) { 
      firstA = row; 
     } 

     if (category[row]=='C' && (firstC == -1 || ranking[firstC] < ranking[row])) { 
      secondC = firstC; 
      firstC = row; 
     } 
     else if (category[row]=='C' && (secondC == -1 || ranking[secondC] < ranking[row])) { 
      secondC = row; 
     } 

     if (category[row]=='S' && (firstS == -1 || ranking[firstS] < ranking[row])) { 
      secondS = firstS; 
      firstS = row; 
     } 
     else if (category[row]=='S' && (secondS == -1 || ranking[secondS] < ranking[row])) { 
      secondS = row; 
     } 


    } 

由於所有的初始的索引爲-1,只要您看到它們分配的相應類別的一行。將索引初始化爲-1可能是危險的,但這是安全的,因爲C應當在它看到時例如停止評估條件語句。 firstA == -1,並且由於短路評估決不會評估排名[-1]。

+1

非常感謝您的幫助。有效!對此,我真的非常感激。我想知道爲什麼這個問題得到-1等級? – ZyxyZ