dポイントプレゼントキャンペーン実施中!

いつもお世話になっております。

VB6で構造体の配列をソートしたいと考えています。

具体的やりかたは調べたいと思うのですが、ヒントとしてひとつ教えてほしいことがありまして質問させていただきました。

たとえば

名前(string)
身長(integer)
体重(single)

何人分かを仮にprofileという名の構造体に入れて、普通の配列と同じ様に体重だけをソートしたとします。

すると体重だけがソートされてしまうのでしょうか?
それとも構造体ごとソートされてくれるのでしょうか?

前者だとかなり悩むことになりそうなので、そこだけ教えていただきたく質問させていただきました。
よろしくお願いします。

A 回答 (4件)

#1です。


回答になっていませんでしたね。

> 何人分かを仮にprofileという名の構造体に入れて、普通の配列と同じ様に体重だけをソートしたとします。

はい、この場合体重だけソートされます。
なので#1のヒントになります。

> 前者だとかなり悩むことになりそうなので、そこだけ教えていただきたく質問させていただきました。

がんばってください。
    • good
    • 0

ソートでは、一部のメンバー(ソートキーの場合)で大小比較をして、データを序列を反映して、移す(ポインタで処理しないとき)ときは、全メンバーを移すのが鉄則です。


そのとき代入を
  構造体名.メンバーA=構造体。メンバーX
  構造体名.メンバーB=構造体。メンバーY
  構造体名.メンバーC=構造体。メンバーZ
・・
のようにしなくてはならないのか、
  構造体名=構造体名
ができるかを質問しているのでしょうが、
http://www.geocities.co.jp/SiliconValley-Bay/743 …
に見つけましたが、昔は
「構造体をまるごと(全メンバーのデータ)を、一度に同じ型の構造体に代入することはできない。」言語仕様の例があったようです。
しかし
>最近の多くのC言語ではその制約がなくなっていますが。・・
でC言語に限らず可能と思います。
心配なら、その使う言語で、数行のプログラムを書いてテストしてみると良いと思います。
昔、(構造体の起源らしい)PLIでも、これができて、これは良い・便利、と思った記憶があります。
http://www.lbm.go.jp/toda/comp/corigin.html
http://www.shoeisha.com/book/pc/20c/chap05/gen.htm
こんな記事もありました。
コードがすっきりしますね。
    • good
    • 0

要はどのように作るかと言うことでしょうが



通常は
Type Profile
  名前 As String
  身長 As Integer
  体重 As Single
End Type
といった、構造体を作成して、

Dim Profiles(100) As Profile
といったように、配列を宣言すると思います。
(注:実際には100の添字は適切な最大値を設定、または、動的配列にする)

で、ソートのためにデータ交換する場合は、例えば以下のような感じですかね。

If Profiles(0).体重 < Profiles(1).体重 then
  Dim Tmp As Profile

  Tmp = Profiles(0)      ※
  Profiles(0) = Profiles(1)  ※
  Profiles(1) = Tmp      ※
End If
(注:実際には0、1等の添字はカウンタ変数等で扱わないと無意味)

上記の※では構造体をデータの集まりとして処理しています。

Profiles(0)={名前="A",身長=Aさんの身長,体重=Aさんの体重}
Profiles(1)={名前="B",身長=Bさんの身長,体重=Bさんの体重}
(注:上記のようなプログラム記述法はありません。実際のコードとして記述するとエラーになります)

例えば、上のようなデータが入っていた場合、適切に『構造体をデータの集まりとして処理』しているならば、

Profiles(n)={名前="A",身長=別人の身長,体重=別人の体重}
のような、ごちゃ混ぜのデータにはなりません。

If Profiles(0).体重 < Profiles(1).体重 then
  Dim Tmp As Integer

  Tmp = Profiles(0).体重
  Profiles(0).体重 = Profiles(1).体重
  Profiles(1).体重 = Tmp
End If
当然ながら、上記のように『構造体をデータの集まりとして処理』せずに、体重のみをソートするようなプログラムコードを書くことは可能です。
その場合、何のためにわざわざ構造体をつかうのかはともかくとして、動作上の問題はありません。
Profiles(n)={名前="A",身長=Aさんの身長,体重=別人の体重}
となるでしょうが。
    • good
    • 1

> すると体重だけがソートされてしまうのでしょうか?


> それとも構造体ごとソートされてくれるのでしょうか?

ソートのアルゴリズム次第だと思いますよ。
体重で比較し構造体ごとスワップかければ構造体ごとソートされます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A