• 締切済み

VASICのプログラムで・・・

VASICで「n個の整数を入れて、それを小さい順にならべまた、ちょうど真ん中の整数を出す」というプログラムを作っています。たとえば、「4,3,5,7,8」、と入力したら「3,4,5,7,8」と出てきて真ん中は「5」です。というような感じです。n個が偶数のときは真ん中の二つのどちらかでいいです。初心者で3つぐらいまでならなんとかできそうなんですが・・。結構いきづまってます。お願いします。

みんなの回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

バブル ソート セレクション ソート シェル ソート についてのVBのサンプルが、MicrosoftのHPで公開されています。 このサンプルは1001個のランダムな数字の収められた配列を、各ソートプログラムに渡し、実行経過時間を測定するようになっております。 実証として、シェルソートが一番早いようです。 以下のプログラムをサンプルプログラムの > MsgBox "イミディエイト ウィンドウで結果をご確認ください" の下に追加してください。   Dim minNum As Long   Dim maxNum As Long   Dim cntAry As Long   Dim lngAryCenter  As Long   Dim lngCenter    As Long      '配列要素数を得る   minNum = LBound(vTemp3)   maxNum = UBound(vTemp3)   cntAry = maxNum - minNum + 1      '(1)と(2)のどちらかを使用する   '(1)配列の真中を求める(配列が偶数個の時、二つ存在する真中の小さい数の方の値を求めるとき)   lngAryCenter = (cntAry + 1) \ 2 '小数点切り捨て   '(2)配列の真中を求める(配列が偶数個の時、二つ存在する真中の大きい数を方の値を求めるとき)   lngAryCenter = Int((cntAry + 1) / 2 + 0.9) '小数点切り上げ      '配列要素が1から始まるとは限らないので、そのずれを補正   lngCenter = lngAryCenter + (minNum - 1)      '中央値の表示   MsgBox "中央の値は「" & lngAryCenter & "」番目の[" & vTemp3(lngCenter) & "]です" これでセンターの値が求められます。 ソートのアルゴリズムは説明できるほど詳しくないので書きませんが、先に述べられているように[ソート][アルゴリズム]で検索をかけたら、あちこちの大学の研究室のHPで詳しく記されています。 かすかな記憶ですが・・・ぼくが大学のとき、バブルソートが一番早いと習ったはずなのですが・・・ 違ったのかなぁー

参考URL:
http://www.microsoft.com/japan/support/kb/articles/J043/8/25.htm
  • yo-kan-62
  • ベストアンサー率18% (18/98)
回答No.2

nこの変数が有り、ソートをして、真ん中の要素を出力すればよいのですが。 3個の要素であれば出来ると言うのは、forを使わない処理ですか? であればforの使い方を学習しましょう。 中央の要素の求め方は簡単ですよね?

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

ソート(並べ替え)を行って、配列中の n/2 番目のデータを取得すればいいですよね。 ソートに関しては、アルゴリズムの本を読めば少なくとも数種類の方法が載っているはずですので、好きなものを使えばいいでしょう。 とりあえず、最も理解しやすいと思われる「バブルソート」を使って造ってみました。 Private Sub Command1_Click()   Dim Data(255) As Long   Dim i As Long, j As Long   Dim tmp As Long      'データを乱数で初期化する   Randomize Timer   For i = 0 To 255     Data(i) = Rnd * 1000   Next i      'データを並べ替える   For i = 0 To 254     For j = 0 To 254 - i       If Data(j) > Data(j + 1) Then         tmp = Data(j)         Data(j) = Data(j + 1)         Data(j + 1) = tmp       End If     Next j   Next i      'ちゃんとソートできてるか確認   For i = 0 To 255     Debug.Print Data(i) & " ";   Next i   Debug.Print         '中間値を得る   MsgBox "中間は " & Data(255 / 2) & " です。" End Sub こんな感じです。 バブルソートについては、ネットで検索をかけてみると沢山ヒットすると思いますが、例えばコレ↓とか。 http://www.soi.wide.ad.jp/class/97001/slides/04/022.html 尚、上のプログラムはかなりヘタレです(^^; 同じバブルソートをするにしても、もっと高速なプログラムはいくらでもあります。 加えて、中間値を求めるのであれば、全部ソートする必要も無いですしね。 興味があれば、市販の「アルゴリズム辞典」などをご覧下さい。

関連するQ&A