課題です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りょう

課題です

#1

投稿記事 by りょう » 18年前

構造体配列のソート関数なんですが、どこから手をつけていいかまったくわかりません。

・構造体定義
  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); //体重によるソート

よろしくお願いします。

keichan

Re:課題です

#2

投稿記事 by keichan » 18年前

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;
    }
}
こんな感じでいかがかしら?

asd

Re:課題です

#3

投稿記事 by asd » 18年前

何から手をつけていいかわからないとのことですが、

・配列のソート自体はやり方わかりますか?
・構造体配列のソートはわかりますか?
・関数の作り方はわかりますか?

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:課題です

#4

投稿記事 by りょう » 18年前

返事が遅くなり申し訳ありません。
お二方のを参考に作ってみました。

#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;



}
}

しかし、まだ動いてくれません。
どこがおかしいのでしょうか?
教えてください。お願いします。

りょう

Re:課題です

#5

投稿記事 by りょう » 18年前

先程の質問ですが、できました。
みなさまありがとうございました。
また、よろしくお願いします。

asd

Re:課題です

#6

投稿記事 by asd » 18年前

うまく動いたようでよかったです^^

できれば「どううまく動かなくて、どう直したらうまく動いたのか」を書いておくと
同じような内容で困っている人がいたときに助けになるのかなと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る