2017-04-18 36 views
1

我正在研究一個程序的一部分,它按照幾個標準對數組中的帖子進行排序。帖子排序很好,直到程序到達最後一塊代碼。爲什麼這些排序標準之一有效,但不是其他排序標準?

的代碼塊,因爲它應該排序的職位:

for (i = 0; i < 11; i++) 
    for (j = i + 1; j < 12; j++) 
     if (serie[j].poang == serie[i].poang) 
      if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta)) 
      { 
       temp.poang = serie[i].poang; 
       serie[i].poang = serie[j].poang; 
       serie[j].poang = temp.poang; 

       temp.gjorda = serie[i].gjorda; 
       serie[i].gjorda = serie[j].gjorda; 
       serie[j].gjorda = temp.gjorda; 

       temp.inslappta = serie[i].inslappta; 
       serie[i].inslappta = serie[j].inslappta; 
       serie[j].inslappta = temp.inslappta; 

       strcpy(temp.namn, serie[i].namn); 
       strcpy(serie[i].namn, serie[j].namn); 
       strcpy(serie[j].namn, temp.namn); 
      } 

雖然這一次似乎並沒有影響到所有的排序(我甚至嘗試在最後扭轉了「<」簽到「如果「在下面的代碼語句,但它不會改變排序可言,導致我相信事情是關閉與整個塊):

for (i = 0; i < 11; i++) 
    for (j = i + 1; j < 12; j++) 
     if (serie[j].poang == serie[i].poang) 
      if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta)) 
       if(serie[j].gjorda < serie[i].gjorda) 
       { 
        temp.poang = serie[i].poang; 
        serie[i].poang = serie[j].poang; 
        serie[j].poang = temp.poang; 

        temp.gjorda = serie[i].gjorda; 
        serie[i].gjorda = serie[j].gjorda; 
        serie[j].gjorda = temp.gjorda; 

        temp.inslappta = serie[i].inslappta; 
        serie[i].inslappta = serie[j].inslappta; 
        serie[j].inslappta = temp.inslappta; 

        strcpy(temp.namn, serie[i].namn); 
        strcpy(serie[i].namn, serie[j].namn); 
        strcpy(serie[j].namn, temp.namn); 
       } 
+1

減法類似'serie [j] .gjorda - serie [j] .inslappta'和serie [i] .gjorda - serie [i] .inslappta'是否溢出? – chux

+1

您應該顯示結構定義。這可能與'namn'成員的定義有關。如果可能是一個數組(char namn [30];')或一個指針('char * namn;'),或者你可能已經發明並做過其他事情。用指針,你必須擔心存儲空間;與你沒有的數組。你應該看看你是否也可以使用結構分配。 –

+1

交換很複雜。建議'temp = serie [i]; serie [i] = serie [j]; serie [j] = temp;'。 – chux

回答

1

當你這樣做:

if (serie[j].poang == serie[i].poang) 
    if ((serie[j].gjorda - serie[j].inslappta) < (serie[i].gjorda - serie[i].inslappta)) 
     if(serie[j].gjorda < serie[i].gjorda) 

然後交換,你有效地說所有這些條件的& &確定順序,這對我來說似乎是錯誤的。

我會做一個函數isInOrder,該函數接受數組指針和兩個索引,如果左邊的那個在右邊那個返回TRUE。然後

if (!isInOrder(serie, i, j)) { 
    // swap 
} 

你的功能(如與意甲S*的類型):

int isInOrder(S *array, int i, int j) { 
    // fill this in. Return 1 if they are in order, 0 if not 
} 

與你原來的主要問題,如果是,當.poang是不是你不指定訂單等於。如果您的原始數組具有所有不同值的.poang,那麼順序將永遠不會改變。

+0

您能否改述「您是否有效地說出所有這些條件的&&?」?我不確定該怎麼做 –

+0

@JakobEklund:只有在(1)'(serie [j] .poang == serie [i] .poang)'_and_(2)'((serie [j ] .gjorda - serie [j] .inslappta)<(serie [i] .gjorda - serie [i] .inslappta))_and_(3)'(serie [j] .gjorda

+0

@JonathanLeffler哦,我明白我現在出了什麼問題,解決了它。感謝所有評論過的人! –