2017-04-18 33 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哦,我明白我现在出了什么问题,解决了它。感谢所有评论过的人! –