#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct KENMEI_DATA
{
char kenmei[100];
int zinkou1;
int zinkou2;
double zoukaritu;
} KENMEI;
int compare(const void *a, const void *b)
{
KENMEI x=*(KENMEI*)a;
KENMEI y=*(KENMEI*)b;
double tmp1=x.zoukaritu;
double tmp2=y.zoukaritu;
return tmp2-tmp1;
}
int main(void)
{
KENMEI data[5]=
{
{"北海道", 5506, 5628, (double)(5506-5628)/5628*100},
{"青森", 1373, 1437, (double)(1373-1437)/1437*100},
{"岩手", 1330, 1385, (double)(1330-1385)/1385*100},
{"宮城", 2348, 2360, (double)(2348-2360)/2360*100},
{"秋田", 1086, 1146, (double)(1086-1146)/1146*100},
};
int i;
qsort(data, 5, sizeof(KENMEI), compare);
for(i=0; i<5; i++)
{
printf("%d, %s, %f%\n", i+1, data[i].kenmei, data[i].zoukaritu);
}
return 0;
}
c言語 qsortについて
c言語 qsortについて
都道府県の人口増加率を求めて、人口増加率の大きい順に並べ替えるプログラムを作成したいのですが 'double' から 'int' への変換とでて、qsortでうまく並べ替えができません。qsortでdouble型を比較して並べ替えるにはどのようにすればよいのでしょうか?
Re: c言語 qsortについて
素直にqsortでdouble型を比較して並べ替えるプログラムを書けば良いです。カヌー さんが書きました:qsortでdouble型を比較して並べ替えるにはどのようにすればよいのでしょうか?
compare関数以外は元のコードのままでいいはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c言語 qsortについて
qsort は、配列の要素を何度も何度も交換してソートを実行します。
ところが、配列の要素のサイズ sizeof(KENMEI) は 120バイトです。
こんな大きなものを交換するのは感心しません。
次のように、ポインタの配列を用意して、それをソートすることを推奨します。
ところが、配列の要素のサイズ sizeof(KENMEI) は 120バイトです。
こんな大きなものを交換するのは感心しません。
次のように、ポインタの配列を用意して、それをソートすることを推奨します。
#include <stdio.h>
#include <stdlib.h>
typedef struct KENMEI_DATA {
char kenmei[100];
int zinkou1;
int zinkou2;
double zoukaritu;
} KENMEI;
int compare(const void *a, const void *b)
{
KENMEI *x = *(KENMEI**)a, *y = *(KENMEI**)b;
if (x->zoukaritu > y->zoukaritu) return -1;
if (x->zoukaritu < y->zoukaritu) return 1;
return 0;
}
int main(void)
{
static KENMEI data[5] = {
{"北海道", 5506, 5628, (double)(5506-5628)/5628*100},
{"青森", 1373, 1437, (double)(1373-1437)/1437*100},
{"岩手", 1330, 1385, (double)(1330-1385)/1385*100},
{"宮城", 2348, 2360, (double)(2348-2360)/2360*100},
{"秋田", 1086, 1146, (double)(1086-1146)/1146*100},
};
KENMEI *p[5];
int i;
for (i = 0; i < 5; i++) p[i] = &data[i];
qsort(p, 5, sizeof(KENMEI *), compare);
for (i = 0; i < 5; i++)
printf("%d, %s, %f%\n", i+1, p[i]->kenmei, p[i]->zoukaritu);
return 0;
}