バブルソートで並べ替えするには?

解決


メガネ  2007-03-22 12:32:30  No: 135824

みなさんには簡単な質問になってしまうかもしれませんが
10個の欄を作って5個の欄に数字を入れ、降順で並べ替えて残りの5個に結果を表示するというものを作っているんですが失敗してしまいます
ご教授いただければ幸いです
下記のように書いたのですがどう変更すればよろしいでしょうか?
textboxの定義づけ(ac等)
        Dim lngArray() As Long
        Dim lngStart As Long
        Dim lngEnd As Long
        lngArray(0) = ac
        lngArray(1) = ad
        lngArray(2) = ae
        lngArray(3) = af
        lngArray(4) = ag
        Dim i As Long
        Dim j As Long
        Dim w As Long
        If Not CBool(lngStart) Then lngStart = LBound(lngArray)
        If Not CBool(lngEnd) Then lngEnd = UBound(lngArray)
        If lngStart >= lngEnd Then Exit Sub
        i = lngEnd
        Do Until i <= lngStart
            j = lngStart
            Do Until j >= i
                If lngArray(j) >= lngArray(j + 1) Then
                    w = lngArray(j)
                    lngArray(j) = lngArray(j + 1)
                    lngArray(j + 1) = w
                End If
                j = j + 1
            Loop
            i = i - 1
        Loop
結果を違う欄に入力


特攻隊長まるるう  2007-03-22 18:29:09  No: 135825

lngStart と lngEnd の処理が邪魔。分かり難くしてる。
全部削除した方が良いと思います。

配列を引数で渡したら、バブルソートでデータを整列させて
戻り値で返すような別関数にして、バブルソートの正しい
動作を確認してみてください。

入力チェックや、指定した要素だけ入れ替えるなどの機能拡張を
考えるのは、その後で良いのでは?


特攻隊長まるるう  2007-03-22 18:40:30  No: 135826

…と思ったが。。。授業でやってるなら自分の実力が伸びる
コードにすべきで。。。模範解答に近くしても意味ないんだよね。

…えーと。上のコードでもとりあえず、それなりに動きましたけど、
>失敗してしまいます
具体的に何がどう失敗しますか?
エラーメッセージが出るならそれを正確に書き写してください。
エラーの出る行も特定してください。


メガネ  2007-03-23 03:03:03  No: 135827

返答ありがとうございます
独学でやっているものでネットと本を参考にしてやっております
>エラーメッセージが出るならそれを正確に書き写してください。
変数"lngArray"は値が割り当てられる前に使用されていますとで、デバックで実行しようとすると、
NullReferenceExceptionはハンドルされませんでした
と出ます

>エラーの出る行も特定してください。
エラーというか警告なんですが
 lngArray(0) = ac
の部分です
verは2005を使用しております


かさのば  2007-03-23 08:28:39  No: 135828

>>NullReferenceExceptionはハンドルされませんでした
バブルソート関係ないですね^^;

http://bakera.jp/hatomaru.aspx/glossary/30aa30d630b830a730af30c853c27167304c30aa30d630b830a730af30c8002030a430f330b930bf30f330b9306b8a2d5b9a3055308c30663044307e305b30933002


メガネ  2007-03-23 09:34:24  No: 135829

すいません無知なもので
url先を拝見させてもらいましたがこの場合どのように変えたらよろしいのでしょうか?


そがっち  2007-03-23 18:03:15  No: 135830

Redim
Redim Preserve
Erase
IsNothing
あたりが、配列処理でよく使う命令ではないかと。
ちょっと調べてみてください。


特攻隊長まるるう  2007-03-23 19:48:16  No: 135831

独学ということなので少し解説を加えておきます。

配列の宣言について基礎学習を行ってください。
入門本で配列を学習するページに必ず書いてある
ような内容です。
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D%E5%88%97%E3%80%80%E5%AE%A3%E8%A8%80%E3%80%80VB&lr=

配列とは、同じ型のデータを連続的に並べたものです。
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D%E5%88%97%E3%81%A8%E3%81%AF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
(少し高度な理解をするなら、先頭のデータのメモリ番地
が格納される参照変数となります)
メモリ上にどのように確保されるかイメージしてみて
ください。

同じ部屋が連続的に並ぶマンションのように、
同じ型のデータを格納できる部屋が要素の数だけ
用意されます。

では、
>        Dim lngArray() As Long
この宣言で部屋を何個用意しますか?

…答えは『用意できない』です。部屋の数が
分かりませんので。このような場合VBは、
マンションの土台のみしか用意しません。
部屋がまだ用意されていないのにデータ(住人)に
『入れ』って命令しても『無理っ!』って
なります。これがエラーメッセージの意味です。
>変数"lngArray"は値が割り当てられる前に使用されています

どの様に修正するか?ですが、
>        Dim lngArray(4) As Long
部屋の数を明示的に宣言します。
もしくは

そがっちさんご紹介の Redim を使います。
コードで Redim と書いて選択状態にし、[F1]キーを
押してください。ヘルプに飛びます。使用方法として
サンプルコードも載ってますので理解してください。

なぜ後から部屋の数が変えられるのでしょう?
現実のマンションで住人に応じて部屋数を変えるのは
難しいですが、維持費がかかって効率が悪いですよね?
メモリ上の部屋の数が自由に増減できると、不必要な
部屋を作らないことが可能なので、便利だからです。

質問とは関係ないですが、
>                If lngArray(j) >= lngArray(j + 1) Then
>                    w = lngArray(j)
>                    lngArray(j) = lngArray(j + 1)
>                    lngArray(j + 1) = w
>                End If
等価(イコール)の時も入替えています。
…でも、入替えた結果って…同じですよね?
じゃあ、無駄な入替えの処理が実行されますよね?
最初の If 文に =(イコール)は必要ないでしょう。

Cですけど、VBのコードと見比べれば意味は分かると思います。
自分のコードと見比べてください。
http://www.codereading.com/algo_and_ds/algo/bubble_sort.html


そがっち  2007-03-23 22:43:39  No: 135832

特攻隊長まるるう さん、ご苦労様です。

私の方も丸投げばかりというのはアレなので、Long型1次元配列に
データを追加していく関数を作ってみました。
参考になればいいのですが…

    Private Sub AddLongDataToArray(ByRef array() As Long, ByVal dat As Long)
        If IsNothing(array) Then
            ReDim array(0)
        Else
            ReDim Preserve array(UBound(array) + 1)
        End If
        array(UBound(array)) = dat
    End Sub


メガネ  2007-03-24 01:20:27  No: 135833

特攻隊長まるるうさん、かさのばさん、さがっちさん
返答頂きありがとうございました
皆さんの返答を元に作り直したところ動くようになりました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加