構造体配列の並べ替え

このQ&Aのポイント
  • VB6で構造体の配列をソートする方法について教えてください。
  • 構造体配列をソートする際、体重だけをソートするのか、構造体ごとソートするのか教えてください。
  • VB6で構造体配列をソートする際の考え方について教えてください。
回答を見る
  • ベストアンサー

構造体配列の並べ替え

いつもお世話になっております。 VB6で構造体の配列をソートしたいと考えています。 具体的やりかたは調べたいと思うのですが、ヒントとしてひとつ教えてほしいことがありまして質問させていただきました。 たとえば 名前(string) 身長(integer) 体重(single) 何人分かを仮にprofileという名の構造体に入れて、普通の配列と同じ様に体重だけをソートしたとします。 すると体重だけがソートされてしまうのでしょうか? それとも構造体ごとソートされてくれるのでしょうか? 前者だとかなり悩むことになりそうなので、そこだけ教えていただきたく質問させていただきました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tkrn
  • ベストアンサー率53% (33/62)
回答No.2

#1です。 回答になっていませんでしたね。 > 何人分かを仮にprofileという名の構造体に入れて、普通の配列と同じ様に体重だけをソートしたとします。 はい、この場合体重だけソートされます。 なので#1のヒントになります。 > 前者だとかなり悩むことになりそうなので、そこだけ教えていただきたく質問させていただきました。 がんばってください。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

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

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

要はどのように作るかと言うことでしょうが 通常は 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さんの身長,体重=別人の体重} となるでしょうが。

  • tkrn
  • ベストアンサー率53% (33/62)
回答No.1

> すると体重だけがソートされてしまうのでしょうか? > それとも構造体ごとソートされてくれるのでしょうか? ソートのアルゴリズム次第だと思いますよ。 体重で比較し構造体ごとスワップかければ構造体ごとソートされます。

関連するQ&A

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • qsortを用いた構造体配列のソート

    お世話になります。 http://simd.jugem.jp/?eid=116 を参考にqsortを用いた構造体配列のソートをC言語で記述しようとしています。 上記のページは、構造体のメンバが配列でない場合です 今回は、メンバが配列のときの構造体配列のソートを実現したいと思っています。 つまり、 typedef struct{ int a; int b[1024]; int c[1024]; }TEST; という構造体配列があって、 TEST base[256]; と宣言し、メンバの配列の添え字を基準としてソートしたいときには、どのようにqsortを用いれば良いのでしょうか、ということです。 どうしたらよいかわからず途方にくれています。 つまり、下のようなソートが行われるには、どのようなプログラムを書けばいいかということです。 構造体でソートするものとします。 構造体でソートできれば、qsortを使っていなくても構いません。 プログラムの得意な方がおりましたら、ご教授下さい。 <ソート前> //************************************************ test[ 0].b[0] = 3; test[ 1].b[0] = 102; ... test[255].b[0] = 1; ------------ test[ 0].b[1] = 99; test[ 1].b[1] = 200; ... test[255].b[1] = 2; ------------ ... ------------ test[ 0].b[1023] = 99; test[ 1].b[1023] = 9; ... test[255].b[1023] = 200; //************************************************** <ソート後>:test[x]ではなく、b[y]を基準としてそれぞれのくくりをソートしたい //************************************************ test[ 0].b[0] = 1; test[ 1].b[0] = 3; ... test[255].b[0] = 102; ------------ test[ 0].b[1] = 2; test[ 1].b[1] = 99; ... test[255].b[1] = 200; ------------ ... ------------ test[ 0].b[1023] = 9; test[ 1].b[1023] = 99; ... test[255].b[1023] = 200; **************************************************

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • バイト配列の構造体変換について

    TCPの通信アプリケーションをて作成しています。 Recvbuff(1024) as byte と定義した変数に受信したデータを格納し以下のような構造体に格納 したいのです。 構造体A id as integer Usercode as string Username as string Filename as string このとき、共用体のような使いかたはVBではできないようなので すが、このような場合 整数なら「Recvbuff(1) * 256 + Recvbuff(0)」のように計算する。  文字列なら必要な文字のみ切り取ってGetStringで変換する。 といった方法しかないのでしょうか。 環境は VS2008 VB.NET です。

  • Javaには、構造体はないんですか?

     C言語の構造体みたいなのはないんですか? 野球のデータを扱っているのですが、構造体がないのでできません。 打率の順位をソートしたいのですが、Cでは構造体でソートすれば選手名まで全部ソートできたのですが。。。 Javaでは、いちいち選手名、打率などの配列を作っているのですが、打率をソートしてから選手名と一緒に表示しようとしても打率の配列だけ、ソートしてあり選手名の配列と打率の配列があいません。 要するに、打率の配列はソートし、選手の配列はデータを入力したときのままなので、順番が違っているのです。 うまい方法を教えてください。初歩的な質問でごめんなさい。

    • ベストアンサー
    • Java
  • 構造体配列の安定なソート

    出席番号と得点の配列を持つ構造体配列で、 出席番号順に並んだ状態でqsortを使って得点をソートする場合、 同じ得点の人でも、出席番号順はばらばらになってしまいますよね。 調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、 qsortは標準ライブラリにあって、 比較関数も見よう見まねで作ってなんとかなったのですが、 他の方法となると具体的にどうすればいいのか、 よくわからない状況です。 http://homepage1.nifty.com/daccho/program/algo/sort3.htm こちらのサイトのソースファイルを見て、 普通のint配列のバブルソートは出来たのですが、 構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、 ここからどのように変更すればいいのでしょうか? 並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、 ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。 Cは勉強中で、基本文法がわかるぐらいという状況で、 もしかしたら変なことを言っているのかもしれませんが、 よろしくお願いします。

  • 命名規則 VB 構造体

    VBの構造体の命名はどうすればいいですか? strXXX as string intYYY as integer ???ZZZ as 構造体 udtZZZ as 構造体 でいいのでしょうか? ユーザー定義型ということでいいのでしょうか?

  • 構造体配列のソート

    VB6 ソートのやり方は知っていますが、構造体の定義が変わると対応できません。 ソート処理部分だけを共通関数にできますでしょうか? Private Type Sort strCol1 As String intCol2 As Integer sttCol3 As String End Type Private Sub A() Dim typSort(3) As Sort 'ここに、構造体データ設定処理を記述 Call subSort(typSort(), typSortCopy) End Sub Private Sub subSort(typTaget() As Sort) Dim lngOutLoop As Long Dim lngCurent As Long Dim lngInLoop As Long Dim Min As Variant Dim typSortCopy As Sort For lngOutLoop = LBound(typTaget) To UBound(typTaget) - 1 Min = typTaget(lngOutLoop).strCol1 lngCurent = lngOutLoop For lngInLoop = lngOutLoop + LBound(typTaget) + 1 To UBound(typTaget) If typTaget(lngInLoop).strCol1 < Min Then Min = typTaget(lngInLoop).strCol1 lngCurent = lngInLoop End If Next lngInLoop typTagetCopy = typTaget(lngOutLoop) typTaget(lngOutLoop) = typTaget(lngCurent) typTaget(lngCurent) = typTagetCopy Next lngOutLoop End Sub

  • VB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

    VB6でプログラムを作っていたときは 値のセットが配列になるとき 構造体を動的配列で宣言してデータを足して作りました。 VB2008で開発をすることになり 同じようなことをしたいのですが もっと便利なやり方が登場したりするのでしょうか? クラスで挑戦したのですが動的配列はできないようでした。

  • C言語の構造体の配列の扱い方

    #include <stdio.h> struct record { char name[10]; float height; float weight; }; /* 各データを、長さ 5 の record 構造体の配列に代入 */ struct record records[5] = { { "yasuo", 170.5, 70.5 }, { "hideaki", 176.5, 65.8 }, { "nobu", 166.5, 58.2 }, { "yuichi", 168.0, 65.4 }, { "nori", 152.7, 68.6 } }; float std_weight(struct record r){ /* 標準体重 = (身長 - 100) * 0.9 */ return (r.height - 100.0) * 0.9; } float std_weight(struct record r); となっている時に、メイン関数にて、5人の身長をもとめる方法と適正標準体重を求める方法を教えてください。構造体の配列を一括で扱うコードがいまいちわかりません。おねがいします。

専門家に質問してみよう