下のコードでは、0番目の列(int型のsku)で最初にソートできるようにする5x4配列があり、等号がある場合は1番目の列(植物、文字列:例:CA72> CA70 CAは常に2つの整数、この場合は7と2の前にあります)、最後に2番目の列(double型の時代)になります。Cで各列の型が異なる2次元配列をソートする方法は?
残念ながら、この現在のコードでは、データを構造体に正しく解析することさえできません。私は構造体を使用したことがありませんので、私の質問は二重です:構造体の初期化でどこが間違っているのですか?最後に、上記のように一度に1つの列を並べ替える方法はありますか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct st_ex {
int sku;
char plant[4];
char age_code[10];
int qty;
// char product[16];
// float price;
};
int comp_sku(const void *a, const void *b) { //qsort struct comparision function (sku int field)
struct st_ex *ia = (struct st_ex *)a;
struct st_ex *ib = (struct st_ex *)b;
return (int)(ia->sku - ib->sku);
/* int comparison: returns negative if b > a
and positive if a > b. */
}
int comp_plant(const void *a, const void *b) { //qsort struct comparison function (plant C-string field)
struct st_ex *ia = (struct st_ex *)a;
struct st_ex *ib = (struct st_ex *)b;
return strcmp(ia->plant, ib->plant);
/* strcmp functions works exactly as expected from
comparison function */
}
int comp_age(const void *a, const void *b) { //qsort struct comparison function (age double field)
struct st_ex *ia = (struct st_ex *)a;
struct st_ex *ib = (struct st_ex *)b;
return strcmp(ia->age_code, ib->age_code);
}
void print_array(struct st_ex *array, size_t len){
size_t i;
for(i=0; i<len; i++)
printf("[ SKU: %i \t Plant: %s \t Code: %s \t Qty: %i ]\n", array[i].sku, array[i].plant, array[i].age_code, array[i].qty);
puts("--");
}
void sort_struct(void) {
struct st_ex structs[] = {{"4010","CA50","15834.0261","5"},
{"4010","CA50","15876.0261","6"},
{"4010","CA52","14834.0261","7"},
{"4200","CA72","16028.3085","9"},
{"4001","CA72","15022.0001","9"}};
size_t s_len = sizeof(structs)/sizeof(struct st_ex);
puts("*** Original array...");
print_array(structs, s_len); //Print original array
puts("*** Sorted by sku...");
qsort(structs, s_len, sizeof(struct st_ex), comp_sku);
print_array(structs, s_len); //Print array sorted by sku
puts("*** Sorted by plant...");
qsort(structs, s_len, sizeof(struct st_ex), comp_plant);
print_array(structs, s_len); //Print array sorted by plant
/** How do I sort by sku first and then plant? (provided the sku's are equal)*/
}
void main() {
sort_struct();
}
ご協力いただきありがとうございます。
注:ここで私は今、変化してきたものだが、それはまだダブルスをソートすることができません。
int comp_sku(const void *a, const void *b) { //qsort struct comparision function (sku int field)
struct st_ex *ia = (struct st_ex *)a;
struct st_ex *ib = (struct st_ex *)b;
if (ia->sku == ib->sku && ia->age_code == ib->age_code){
return strcmp(ia->age_code, ib->age_code);
}
else if(ia->sku == ib->sku){
return strcmp(ia->plant, ib->plant);
}
else{return (ia->sku-ib->sku);}
}
フォローアップ編集:だから
私が望んでいた場合に、例えば[4001、CA87,22345.234、48] [...] x 100,000のような行列を読み取る.csvファイルを使用してこのデータセットをインポートします。私は新しいニーズに合わせてコードを変更しようとしましたが、サイズを定義することなく構造体の新しい命名が問題になっています。私は間違って何をしていますか?
void main() {
char buffer[1024], *line;
struct st_ex input;
unsigned long lineno = 0UL;
FILE* inputdoc = fopen("input/old_input.csv", "r");
while (1) {
line = fgets(buffer, sizeof buffer, inputdoc);
if (!line)
break;
lineno++;
if (sscanf(line, "%d, %4s, %10s, %d", &input.sku, &input.plant, &input.age, &input.qty) != 4) {
fprintf(stderr,"Cannot parse line %lu.\n", lineno);
break;
}
/* Do something with 'struct st_ex input'. */
};
size_t s_len = sizeof(input)/sizeof(struct st_ex);
puts("*** Original array...\n");
//print_array(input, s_len); //Print original array
puts("\n*** Sorted by sku, plant, age.\n\n");
qsort(input, s_len, sizeof(struct st_ex), comp_sku_plant_age);
print_array(input, s_len); //Print array sorted by sku
}
1) 'チャー植物[4]。 char age_code [10]; ' - >' char plant [5]; char age_code [11]; 2) '{" 4010 "、" CA50 "、" 15834.0261 "、" 5 "}' - > '{4010、" CA50 "、" 15834.0261 "、5}' – BLUEPIXY
で並べ替えSKUは、2つの一致が得られた場合、compare関数から0を返す代わりに、戻り値を計算する文字列を調べます。つまり、 'comp_sku'関数を修正します。 'if(ia-> sku == ib-> sku)はstrcmp(ia-> plant、ib-> plant)を返します。 else return(ia-> sku-ib-> sku); ' – enhzflep
あなたの用語は混乱しているか混乱しています。 2D配列ではなく、構造体型の配列(たぶん1次元)を記述しているようです。それ以外はすべて、Cのすべての配列は均質です。 1つのタイプの要素のみを含みます。複数のタイプではありません。 (ポインタや物事でゲームをすることもできますので、配列に異なる型を格納するように見えますが、実際にはそうではありません - あなたが扱っているものよりも複雑です)。 '異なるメンバーの異なる基準を持つ構造タイプの配列をソートするにはどうすればよいですか?' –