- ベストアンサー
VBでのバブルソートの課題です。
VBでのバブルソートの課題です。 まったくの初心者でパソコン自体苦手なので何がなんだかわかりません。 型宣言?とセル?の意味もよくわかりません… 課題は↓です…締め切りが今日の夜9時までなんです… どなたか手を貸していただけませんか… 次のように並んでいる数列をバブルソートを用いてソートしなさい。 9 6 7 1 2 途中の過程もシート上に出力すること。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>VBでの セル?という言葉が出ているのでエクセルVBAでしょう。VBと核になる点(文法など)は同じですが、全体では別物なので正確に書いておくこと。 >型宣言? プログラム言語でプログラムするとき、データは一旦変数という記憶領域に蓄えます。 そのデータ性格や記憶域の長さを決めるのが、型宣言です。ーー>データ型を宣言する VBAはVB6に当たるので、Googleででも「VB 型宣言」で照会すると沢山解説が有るが、 http://hanatyan.sakura.ne.jp/vbhlp/hensu.htm の変数の型の種類などを読むこと。 質問者の今の情況では、整数型と文字列型を使う例題が多いだろう。 >バブルソート Googleでも「バブルソート」で照会して記事を読むこと。バブルは水の泡のことで、泡は水中の下のほうに発生すると上に浮かび上がってくる。このイメージから命名されている。 http://aitech.ac.jp/~koikelab/webp/vba/vba_9.html など この隣接(セル)交換法でやってみる。 エクセルのシートにA1:A5に 9 6 7 1 2 があるとすると、隣接交換法であるから1行目と2行目を比較して、小さいほうを上行に持っていく。次に2行目と3行目を比較するが、2行目は置き換わった後のデータである場合もある。 それに並べ替え完了をどう理解するかも初心者には難しい。 一回下行まで行くと1つの最大値が決ると理解すると良い。 上記のWEBの下から最大値が確定していく様を見て考えてください。 あまりなれない課題でミス無きを祈るが Sub test01() j = 1 k = 4 p1: For i = 1 To k Range(Cells(1, j), Cells(5, j)).Copy Range(Cells(1, j + 1), Cells(5, j + 1)) j = j + 1 If Cells(i, j) < Cells(i + 1, j) Then 'そのまま Else 'Cells(i, j) > Cells(i + 1, j) w = Cells(i, j) '大 Cells(i, j) = Cells(i + 1, j) '小を上に Cells(i + 1, j) = w '大を下に End If Next i k = k - 1 If k = 0 Then Exit Sub End If GoTo p1 End Sub Goto文を使わないのが普通らしいが、繰り返しの仕組みのステートメントを使わないためにあえて使った。 ーー 途中経過(上記実行結果) エクセルシート 9 6 6 6 6 6 6 6 1 1 1 6 9 7 7 7 7 1 1 6 2 2 7 7 9 1 1 1 7 2 2 6 6 1 1 1 9 2 2 2 7 7 7 7 2 2 2 2 9 9 9 9 9 9 9 9確定 7確定 6確定 2確定 >途中の過程もシート上に 先生は理解のために言ったのだろうが、エクセルVBAをよく知ってないとうまく行かないし、簡単な課題ではないし、バブルソートの理解とは別の技法だと思う。 バブルソートの考えやコードが霞んでしまうと思うが、上記には組み込んだので判りにくくなっている 部分があるだろう。 ーーーー エクセルでやるのは、入力や途中経過や最終結果出力を記録出来て見やすいが、VBAの知識が少し要るということ。
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
回答を書きますけど、突っ込まれて絶句しないようにネ。 Sub バブルソート() Dim G&, V&, I&, J&, K& ReDim B(4) As Long '始めに値を配列に格納する For I = 1 To 5 B(I - 1) = Cells(1, I) Next G = 1 '途中経過を表示すべき行 For I = 0 To 3 '個数より1個少なく指定 For J = I + 1 To 4 '現在位置から終端まで検査 If B(I) > B(J) Then '大小関係が逆か調べる V = B(J) '入れ替える B(J) = B(I) B(I) = V G = G + 1 '行位置を更新 For K = 1 To 5 '途中経過を表示 Cells(G, K) = B(K - 1) Next End If Next Next End Sub
- n-jun
- ベストアンサー率33% (959/2873)
どのように書けば課題として提出出来るのかが、 不明な感じがしますけど。 と言うよりもコード丸々をそのまま提出したら、 バレてしまうじゃないですか。
- web2525
- ベストアンサー率42% (1219/2850)
まずはバブルソートについて検索だ http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88 バブルソートの意味を十分理解したらプログラミングなのだが >?とセル?の意味もよくわかりません 課題と銘打っているからには授業か何かで出されたのですよね? 型宣言はVBの初歩の初歩、セルに関してはExcelの基本なんですが 授業で習っていませんか? プログラムの動作としては 一定領域内の最初のセルと次のセルの数値を比較して 最初のセル>次のセルの場合はそのセルの入れ替えを行う 同様に領域内のすべてのセルに対し比較入れ替えが終了したら 再度領域の先頭から比較入れ替えを繰り返し 領域の最後まで比較しても入れ替えが行われなかった時点で終了 という流れなんですが 課題として提出されたものの丸投げはこのサイトの主旨に反しているため、ヒントまたはご自身で制作したコードの添削以外回答が出るかな?
お礼
最終的には知人に聞いて課題を提出しましたが、非常に丁寧に答えていただいたのでベストアンサーとさせていただきます。ありがとうございました。