2017-03-23 10 views
0

2つの配列が並んでいます.1つは異なるチームをリストし、もう1つはスコアをリストします。スコアの順位を降順で並べ替えることができます。この注文を使用して、対応するチームをリーダーボードの正しい位置に移動できますか?例えば。コメントで述べたように100ポイント(米国、ドイツ)を持つ2つのチームがボード1つの配列をソートして別の配列にコピーする

#include <stdio.h> 

int main() 
{ 
char teams[18][20]={"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA","Mexico","Australia","Belize","Denmark","Sweden","Japan","South Africa","Algeria"}; 
int points[18]={43,5,77,23,89,0,100,46,94,100,45,55,32,65,11,37,26,78}; 
int i; 
int j; 
int a; 

for (i = 0; i < 18; ++i) 
{ 
     printf("%i ",i+1); 
     printf("%s",teams[i]); 
     printf("\t%d\n", points[i]); 
} 
printf("\n"); 
for (i = 0; i < 18; ++i) 
{ 
     for (j = i + 1; j < 18; ++j) 
     { 
      if (points[i] < points[j]) 
      { 
       a = points[i]; 
       points[i] = points[j]; 
       points[j] = a; 
      } 
     } 
    } 
    for (i = 0; i < 18; ++i) 
    { 
     printf("%i ",i+1); 
     printf("%s",teams[i]); 
     printf("\t%d\n", points[i]); 
    } 
    return 0; 
    } 
+1

入れチームと点構造体の配列ではなく、別々のアレイです。 –

答えて

2

の上部に移動し、典型的な解決策は、構造体ではなく、別の配列の配列としてデータをモデル化することです。データは互いに関連付けられているので、これは意味があります。 (つまり、関心のかどうか、あなた自身のソートコード)次に、あなたが全体の構造のインスタンスをソートするqsort()を使用することができ、すべてのデータがあるため一緒に残ります

struct score { 
    const char *name; 
    int points; 
} scores[] = { 
{ "England", 43 }, 
{ "Ireland", 5 }, 
/* and so on */ 
}; 

次のようなものを持っていると思います全体の構造が動いている。

0

ソートの際には、チームの配列を整理してください。

a = points[i]; 
b = teams[i]; 
points[i] = points[j]; 
teams[i] = teams[j]; 
points[j] = a; 
teams[j] = b; 
0

(他の人が指摘したように)structにあなたの配列を埋め込むことですが、あなたはあなたがあなた自身の機能を構築し、一度に両方の配列をソートすることができ、並列配列を使用することを余儀なくされている場合は明白な方法:

#include <stdio.h> 

static int comp(const void *a, const void *b) 
{ 
    return *(int *)a - *(int *)b; 
} 

static void swap(int v1[], char *v2[], int a, int b) 
{ 
    int temp1; 
    char *temp2; 

    temp1 = v1[a]; 
    v1[a] = v1[b]; 
    v1[b] = temp1; 
    temp2 = v2[a]; 
    v2[a] = v2[b]; 
    v2[b] = temp2; 
} 

static void sort(int v1[], char *v2[], int left, int right, int (*comp)(const void *, const void *)) 
{ 
    int i, last; 

    if (left >= right) return; 
    swap(v1, v2, left, (left + right)/2); 
    last = left; 
    for (i = left + 1; i <= right; i++) { 
     if (comp(&v1[i], &v1[left]) < 0) 
      swap(v1, v2, ++last, i); 
    } 
    swap(v1, v2, left, last); 
    sort(v1, v2, left, last - 1, comp); 
    sort(v1, v2, last + 1, right, comp); 
} 

int main(void) 
{ 
    char *teams[] = {"England","Ireland","Wales","Scotland","France","Italy","Germany","Uraguay","Belgium","USA","Mexico","Australia","Belize","Denmark","Sweden","Japan","South Africa","Algeria"}; 
    int points[] = {43,5,77,23,89,0,100,46,94,100,45,55,32,65,11,37,26,78}; 
    size_t i, n = sizeof(points)/sizeof(*points); 

    sort(points, teams, 0, n - 1, comp); 
    for (i = 0; i < n; i++) { 
     printf("%s->%d\n", teams[i], points[i]); 
    } 
    return 0; 
} 

出力:

Italy->0 
Ireland->5 
Sweden->11 
Scotland->23 
South Africa->26 
Belize->32 
Japan->37 
England->43 
Mexico->45 
Uraguay->46 
Australia->55 
Denmark->65 
Wales->77 
Algeria->78 
France->89 
Belgium->94 
Germany->100 
USA->100 
関連する問題