• 締切済み

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

  • C++のプログラム

    C言語の問題を授業で出されたのですがさっぱり分かりません。教えて下さい。 1.キーボードから整数nを入力して、1+2+…+nを求めるプログラムを作れ。 2.キーボードから整数nを入力して、1*2*…*nを求めるプログラムを作れ。 3.キーボードから10個の実数を入力し、それらの平均を求めるプログラムを作   れ。 4.円錐の体積を求めるプログラムを作れ。 注:円錐体積V=π*r*r*h/3 5.キーボードから文字列を入力し、それを逆さまにするプログラムを作れ。例えば、”dog”を逆さまにすると”god”になる。 6.キーボードから一つの整数を入力し、それは奇数か偶数かを判断するプログラムを作れ。 ちなみに6番は /* iftst.c */ #include <stdio.h> void main(void) { int n; printf("n="); scanf("%d",&n); if(n%2 == 0){ printf("偶数です\n"); } else{ printf("奇数です\n"); } } で合っているのでしょうか?

  • プログラム 教えてください

    1.INPUT文で入力された整数kに対し,3以上7以下の整数をランダムに(等確率で)k個生成し,同じ行に表示させるプログラム 2.INPUT文で入力された整数m, n, kに対し,m以上n以下の整数をランダムに(等確率で)k個生成し,同じ行に表示させるプログラム を教えてください。

  • Cプログラム

    c言語で「正整数Nを入力後、N個の実数を入力し、それらの平均値と最大値を表示するプログラム」を教えてください。

  • c言語プログラミングの質問です。

    整数NとN個の整数を受け取り,受け取ったN個の整数のうち最大のものを表示するプログラムを記述せよ. ただし,N>0とする. 入出力例 入力 ⇒ 出力 3 2 1 8 ⇒ 8 5 13 14 11 12 15 ⇒ 15 2 -1 -2 ⇒ -1 という問題です。「3つの数の中から~」という場合はそれぞれa,b,cとおいて比較できるのですが、この問題のような場合はどうすればいいですか。

  • プログラム(BASIC) 教えてください

    (1) INPUT文で入力した整数 k に対し, 3, 5, 7, 9 のいずれかの値をランダムに等確率で発生し,改行せず横に続けて k個 表示させるプログラム (2)初項 a ,公差 r ,長さ n の等差数列 a, a+r, a+2r, ..., a+(n-1)r のいずれかの値を等確率で発生させるためには,乱数をどのような式で作れば良いか? INPUT文で与えられた a, r, n, k に対して,この等差数列のいずれかの値をランダムに k 個表示させるプログラム (1)は0,2,4,6を考えてから+3すればいいと思うのですがランダムに0,2,4,6を表示するプログラムの仕方が分かりません。 10 INPUT k 20 FOR L=1 TO k 30 RANDOMIZE 40 PRINT INT(   )+3; 50 NEXT L 60 END 解説があるとありがたいです。

  • 簡単なプログラムなんですが…

    C言語の簡単なプログラムなんですが、私のような初心者には良く分かりません… 出来るだけ詳しく教えていただけるとうれしいです。 下の2つのプログラムの作り方が理解できません。 (1)データ数nとn個のデータを入力して、その平均を求めるプログラム。 (2)(1)のプログラムに合計と標準偏差を計算して出力する機能を追加したプログラム。 C言語に詳しい方お願いします。

  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • プログラム(C)

    n個の整数値をキーボードから打ちその最大値、最小値、平均値を表示するプログラムがわかりますか?平均値は小数第一位までもとめます。

  • 中央値の求め方の証明

     n個の整数が存在したとき、nが偶数である場合の中央値は(n/2 + n/2+1)*1/2であり、nが奇数である場合の中央値はn+1/2であることを証明せよ。  という問題を自分で作ってみたのですが、この問題の証明の仕方でいい解答をいくつか自分で考えてみたのですが、皆さんならどう証明するか(証明の仕方)を教えてください。

  • このプログラムはどのように作成するのでしょうか?

    プログラム作成について勉強しているのですが、分からないのでぜひ教えていただきたいです。 整数Mと初期値X(0)の値を入力し、 X(n+1)=16807X(n) をN=Mまで計算しファイルX.dataに書き出すプログラムを作成 (X(n)は倍数度実数) 分かる方、ぜひご教授ください。

専門家に質問してみよう