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

このQ&Aに関連する最新のQ&A

A 回答 (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/articl …
    • good
    • 0

nこの変数が有り、ソートをして、真ん中の要素を出力すればよいのですが。



3個の要素であれば出来ると言うのは、forを使わない処理ですか?
であればforの使い方を学習しましょう。

中央の要素の求め方は簡単ですよね?
    • good
    • 0

ソート(並べ替え)を行って、配列中の 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/ …


尚、上のプログラムはかなりヘタレです(^^;
同じバブルソートをするにしても、もっと高速なプログラムはいくらでもあります。
加えて、中間値を求めるのであれば、全部ソートする必要も無いですしね。

興味があれば、市販の「アルゴリズム辞典」などをご覧下さい。
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

Q「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現在のセル( n , "A" )より14行上に数値がないことを確認するために
'14行上のセルを全て足し算しています。
For m = n - 14 To n - 1
s = s + Worksheets("Sheet1").Cells(m, "A").Value
Next

'足し算結果がゼロならば何も記入していないと判断し、
'数字の「1」を記入します。
If s >= 1 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 0
ElseIf s = 0 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 1
End If
End Sub

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現...続きを読む

Aベストアンサー

はいはい了解。

今着目しているセルが (n,1)であるとする。

条件: 今いるところから上に14行サーチして、一度でも1か2の値が見つかったら
     回答を0とする。14行すべてに1・2の値がひとつも含まれていなければ1とする。



Ans = 1

for i = 1 to 14

x = cells ( n - i , 1 ).value

if x = 1 or x = 2
then
Ans = 0
endif
next i


cells ( n , 1 ) = Ans


デフォルトの回答値=1としておき、一回でも条件にヒットしたら回答値=0にする。
ヒットしたらfor~nextを強制的に閉じてもいいけど、面倒なのでそのまま14回検索する。

Q実数の整数部,小数部の取得

OS:windows2000pro
VB:VB6.0sp5

実数 num(変数) [as currency]
 (但し 小数点以下2位まで)の値の
1.整数部 num_int(変数) [as long]
2.小数部 num_dec(変数) [as long]
を上記変数に格納するのは、どのようにすればいいのでしょうか?

(例1)num = 123.02 の場合、num_int=123, num_dec=2
(例2)num = 4.20 の場合、num_int= 4, num_dec=20
(例3)num = 0.23 の場合、num_int= 0, num_dec=23

 よろしくお願いいたします

Aベストアンサー

VB6ならこうです。
num_int = Fix(num)
num_dec = 100 * (num - num_int)

Q0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません
5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Long
Dim f As Long

n = CLng(TextBox1.Text) ←ここにエラーが出ます。

TextBox2.Text = CStr(Recur(n))
End Sub

Public Function Recur(ByVal arg As Long) As Long
If arg = 1 Then
Recur = arg
Exit Function
End If
Recur = arg * Recur(arg - 1)
End Function
End Class

というプログラムです。分かる方よろしくお願いします。
実行エラーです。

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません
5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Long
Dim f As Long

n = CLng(TextBox1.Text) ←ここにエラーが出ます。

TextBox2.Text = CStr(Recur(n))
End Sub

Public Function Recur(ByVal arg As Long) As L...続きを読む

Aベストアンサー

TextBoxに入力された値は、単一の文字列として扱われます。
[5 12]と入力した場合にTextプロパティで取り出せる値は、"5 12"というひとつの文字列です。"5"と"12"のふたつの値を取得することはできません。

なので、数字以外の文字を含む文字列である"5 12"を数値型に変換しようとするとエラーが出てきてしまいます。"5あいうえお12"を数値に変換できないのと一緒です。

複数の入力値を取りたいならば、入力用のTextBoxを複数個用意したり、または入力値をスペースで分割して複数個の値を取り出すコードを実装するなどの工夫が必要です。

Qn個のスペースを全てブランクと判断したい

Visual Studio 2005 SP1を使用しております。

Stringの変数にスペースが何個入っていてもブランクと判断したいのですが、どうすればいいでしょうか?

Dim moji as String = "  "
Dim moji2 as String = "     "

この両方をブランクと判断したいと思ってます。

Aベストアンサー

StringクラスのTrimメソッドを使ってみては

Dim moji as String = "  "
Dim moji2 as String = "     "

if moji.Trim() = "" then
  MsgBox "ブランク"
end if
if moji2.Trim() = "" then
  MsgBox "ブランク"
end if

といった具合で ...


人気Q&Aランキング

おすすめ情報