構造体配列のソート関数なんですが、どこから手をつけていいかまったくわかりません。
・構造体定義
typedef struct_Human{
short nID; //ID番号
char szName[20]; //名前
short nHeight; //身長
short nWeight; //体重
}HUMAN;
・関数プロトタイプ
void sortStruct(HUMAN stHuman[/url], short nKey, short nCount);
・仕様
HUMAN構造体配列に格納させれいる入力値(HUMAN stHuman[/url])を任意のソート法を用いて昇順ソートし、
同配列に格納するソートのキーとなるメンバはキーメンバ(HUMAN nKey)で格納されたものとする。
※ID番号->1 名前->2 身長->3 体重->4
なお、配列の格納件数はunsigned short unCountで格納された件数とする。
・使用例
HUMAN stHuman[10]
stHuman[0]. unID = 1;
strcpy(stHuman[0]. szName, "山田太郎");
stHuman[0]. nHeight = 180;
stHuman[0]. nWeight = 100;
//
// 同様に計10件のデータをセット
//
sortStruct(stHuman, 3, 10); //身長によるソート
sortStruct(stHuman, 2, 10); //体重によるソート
よろしくお願いします。
課題です
Re:課題です
void sortID(HUMAN stHuman[/url], nCount) { /* お好きなソートアルゴリズムを実装 */ } void sortName(HUMAN stHuman[/url], nCount) { /* お好きなソートアルゴリズムを実装 */ } void sortHeight(HUMAN stHuman[/url], nCount) { /* お好きなソートアルゴリズムを実装 */ } void sortWeight(HUMAN stHuman[/url], nCount) { /* お好きなソートアルゴリズムを実装 */ } [color=#0000ff">void[/color] sortStruct(HUMAN stHuman[/url], [color=#0000ff">short[/color] nKey, short nCount) { switch( nKey ) { [color=#0000ff">case[/color] [color=#ff0000">1[/color]: sortID(stHuman, nCount); break; [color=#0000ff">case[/color] [color=#ff0000">2[/color]: sortName(stHuman, nCount); break; [color=#0000ff">case[/color] [color=#ff0000">3[/color]: sortHeight(stHuman, nCount); break; [color=#0000ff">case[/color] [color=#ff0000">4[/color]: sortWeight(stHuman, nCount); break; [color=#0000ff">default[/color]: printf([color=#ff0000">"キーの値が不正\n"[/color]); break; } }こんな感じでいかがかしら?
Re:課題です
何から手をつけていいかわからないとのことですが、
・配列のソート自体はやり方わかりますか?
・構造体配列のソートはわかりますか?
・関数の作り方はわかりますか?
qsort関数を使ってよいなら構造体のソートについて参考になりそうなページがありました。
http://www.gulf.or.jp/~damayan/saru/pointer5.html
あとは関数内で受け取ったパラメータによってソートの基準を変えてあげれば完成かなと思います。
上のページのを参考にIDで昇順に並べかえて表示するサンプルを作ってみました。
qsortとか使っちゃダメだったらその部分をソート処理に置き換えればOKかと思います。
#keichanさんのほうが参考になりそうな予感^^;
・配列のソート自体はやり方わかりますか?
・構造体配列のソートはわかりますか?
・関数の作り方はわかりますか?
qsort関数を使ってよいなら構造体のソートについて参考になりそうなページがありました。
http://www.gulf.or.jp/~damayan/saru/pointer5.html
あとは関数内で受け取ったパラメータによってソートの基準を変えてあげれば完成かなと思います。
上のページのを参考にIDで昇順に並べかえて表示するサンプルを作ってみました。
qsortとか使っちゃダメだったらその部分をソート処理に置き換えればOKかと思います。
#keichanさんのほうが参考になりそうな予感^^;
#include <stdio.h> #include <stdlib.h> //構造体定義 typedef struct{ short nID; char szName[20]; short nHeight; short nWeight; }HUMAN; //関数のプロトタイプ void sortStruct(HUMAN stHuman[/url], short nKey, short nCount); //IDの比較用関数 int id_cmp(const void *a, const void *b) { HUMAN *u, *v; /*aとbをそれぞれu,vにキャストして入れる*/ /*uとvのnIDを比較してそれぞれ負の数、0、正の数のどれかを返す*/ } int main() { int i; int N = 4; HUMAN students[/url] = { {1,"Sudo",60,175}, {3,"Aizawa",80,168}, {4,"Osaki",65,190}, {2,"Takami",76,155} }; qsort(students, N, sizeof(HUMAN), id_cmp); printf("IDの昇順\n"); for(i=0; i<N; i++) printf("ID:%d Name:%s Height:%d Weight:%d\n",students.nID, students.szName, students.nHeight, students.nWeight); putchar('\n'); return 0; }
Re:課題です
返事が遅くなり申し訳ありません。
お二方のを参考に作ってみました。
#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<string.h>
#define NUMBER 100
/* データの構造体を宣言 */
typedef struct _HUMAN{
short nID; // ID番号
char szName[20]; // 名前
short nHeight; // 身長
short nWeight; // 体重
} HUMAN;
void sortStruct(HUMAN stHuman[/url], short nKey, short nCount);
// HUMAN stHuman[/url] 入出力:HUMAN構造体配列
// short nKey 入力:キーメンバ(構造体のメンバの番号を指定)
// short nCount 入力:格納件数
main()
{
int i;
short nCount = 5;
HUMAN stHuman[5];
stHuman[0]. nID = 1;
strcpy(stHuman[0]. szName, "山田");
stHuman[0]. nHeight = 180;
stHuman[0]. nWeight = 100;
stHuman[1]. nID = 2;
strcpy(stHuman[1]. szName, "高橋");
stHuman[1]. nHeight = 145;
stHuman[1]. nWeight = 50;
stHuman[2]. nID = 3;
strcpy(stHuman[2]. szName, "中山");
stHuman[2]. nHeight = 170;
stHuman[2]. nWeight = 60;
stHuman[3]. nID = 4;
strcpy(stHuman[3]. szName, "近藤");
stHuman[3]. nHeight = 150;
stHuman[3]. nWeight = 51;
stHuman[4]. nID = 5;
strcpy(stHuman[4]. szName, "岡田");
stHuman[4]. nHeight = 177;
stHuman[4]. nWeight = 70;
printf("ソート前\n");
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman.nHeight,stHuman.nWeight);
printf("\n");
printf("身長によるソート\n");
sortStruct(stHuman, 3, 10);
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman.nHeight,stHuman.nWeight);
printf("\n");
printf("体重によるソート\n");
sortStruct(stHuman, 4, 10);
for(i = 0; i <=nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman[i].nHeight,stHuman[i].nWeight);
}
void sortStruct(HUMAN stHuman[/url], short nKey, short nCount)
{
HUMAN a;
int i, q;
switch(nKey){
case 1:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nID > stHuman[q].nID){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 2:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(strcpy(stHuman[q].szName, stHuma [i].szName) < 0){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 3:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nHeight > stHuman[q].nHeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 4:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nWeight > stHuman[q].nWeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
default:
break;
}
}
しかし、まだ動いてくれません。
どこがおかしいのでしょうか?
教えてください。お願いします。
お二方のを参考に作ってみました。
#define _CRT_SECURE_NO_DEPRECATE 1
#include<stdio.h>
#include<string.h>
#define NUMBER 100
/* データの構造体を宣言 */
typedef struct _HUMAN{
short nID; // ID番号
char szName[20]; // 名前
short nHeight; // 身長
short nWeight; // 体重
} HUMAN;
void sortStruct(HUMAN stHuman[/url], short nKey, short nCount);
// HUMAN stHuman[/url] 入出力:HUMAN構造体配列
// short nKey 入力:キーメンバ(構造体のメンバの番号を指定)
// short nCount 入力:格納件数
main()
{
int i;
short nCount = 5;
HUMAN stHuman[5];
stHuman[0]. nID = 1;
strcpy(stHuman[0]. szName, "山田");
stHuman[0]. nHeight = 180;
stHuman[0]. nWeight = 100;
stHuman[1]. nID = 2;
strcpy(stHuman[1]. szName, "高橋");
stHuman[1]. nHeight = 145;
stHuman[1]. nWeight = 50;
stHuman[2]. nID = 3;
strcpy(stHuman[2]. szName, "中山");
stHuman[2]. nHeight = 170;
stHuman[2]. nWeight = 60;
stHuman[3]. nID = 4;
strcpy(stHuman[3]. szName, "近藤");
stHuman[3]. nHeight = 150;
stHuman[3]. nWeight = 51;
stHuman[4]. nID = 5;
strcpy(stHuman[4]. szName, "岡田");
stHuman[4]. nHeight = 177;
stHuman[4]. nWeight = 70;
printf("ソート前\n");
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman.nHeight,stHuman.nWeight);
printf("\n");
printf("身長によるソート\n");
sortStruct(stHuman, 3, 10);
for(i = 0; i <= nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman.nHeight,stHuman.nWeight);
printf("\n");
printf("体重によるソート\n");
sortStruct(stHuman, 4, 10);
for(i = 0; i <=nCount-1; i++)
printf("%02d\t%s\t%d\t%d\n",stHuman.nID,stHuman.szName,stHuman[i].nHeight,stHuman[i].nWeight);
}
void sortStruct(HUMAN stHuman[/url], short nKey, short nCount)
{
HUMAN a;
int i, q;
switch(nKey){
case 1:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nID > stHuman[q].nID){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 2:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(strcpy(stHuman[q].szName, stHuma [i].szName) < 0){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 3:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nHeight > stHuman[q].nHeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
case 4:
for(i = 0; i <= nCount-1; i++){
for(q = i+1; q <= nCount-1; q++){
if(stHuman[i].nWeight > stHuman[q].nWeight){
a = stHuman[i];
stHuman[i] = stHuman[q];
stHuman[q] = a;
}
}
}
break;
default:
break;
}
}
しかし、まだ動いてくれません。
どこがおかしいのでしょうか?
教えてください。お願いします。