-1
私は 'struct student'の配列をcに用意しています。特定のフィールドで構造体の配列をソートする際の冗長性
struct student
{
int id;
char *name;
int age;
}
int n = 100; //number of students
struct student s[n] = ...
そして私は、特定のフィールドの順序で配列をソートするsortByField機能(バブルソート)を持っています。例えば
void sortByField(struct student *s, int n, int fieldIndex)
{
int i, j;
for(i=n-1; i>0; i--)
{
for(j=0; j<i; j++)
{
switch (fieldIndex)
{
case 1 : if(s[j].id>s[j+1].id) swapData(&s[i], &s[j+1]); break;
case 2 : if(strcmp(s[j].name, s[j+1].name)>0) swapData(&s[i], &s[j+1]); break;
case 3 : if(s[j].age>s[j+1].age) swapData(&s[i], &s[j+1]); break;
}
}
}
}
、Iは、パラメータFieldIndexに
sortByField(s, n, 1);
に1を渡した場合には、IDで配列をソートします。または、2を渡すと名前でソートされます。等々。
あなたが見たのとまったく同じです。私はバブルソートのループでswitch-caseを使用して、どのフィールドを比較するか、並べ替えるかを決定しました。 しかし、私はこれが好きではありません、私はループで何度も何度もfieldIndexのケースをチェックしなければならないと思います。
私はスイッチケースをループから外して一度だけチェックするために努力してきましたが、私はウィットの終わりです。
私はあなたが指摘したことを理解しますが、割り当てはバブルソートを基本的なCプログラミングコースとして使用するように指示します。 – asinkxcoswt
そしてありがとう!一見したところ、より多くの機能が必要だったので、私はこの方法を見落としましたが、あなたが指摘したように、それは良い方法です。しかし、私は単なる関数に入れる方法があるかどうか不思議です。たとえば、スイッチに構造体の各フィールドを参照する変数を生成させるなどです。再度、感謝します。 – asinkxcoswt
申し訳ありませんが、この特定のケースでは分解は唯一の方法です。 'int cmpByField(struct student * a、struct student * b、int fieldIndex)'のような比較関数を作成することができます。しかし、** switch **または** if **が必要です。条件付きでCの構造体のフィールドを参照することはできません。 –