3文字ごとに区切りを入れるプログラム

タグの編集
投稿者 しょしん者  (社会人) 投稿日時 2009/1/31 05:03:08
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      
     Dim pos As Integer = 0   '文字列上のインデックスを示す変数
        
    Dim last As Boolean = False '文字列の終端に到達したかどうか記録
        
    Dim nw As String = ""   '新しい文字列
        
        Dim getlenth As Integer '取りだす文字列(3文字)


      


        Do
        getlenth = Math.Min(3, TextBox1.Text.Length - pos) '入力された文字列の長さと変数                                  posの値から、取り出して良い                                  文字列を計算


         nw &= TextBox1.Text.Substring(pos, getlenth) '入力された文字から上記で計算した文                               字数だけ文字列を取り出し、新しい文                               字列に追加
           
       pos += getlenth  '変数posを次の位置に進める
            
      last = pos = TextBox1.Text.Length  '末尾に達したかどうか

            If Not last Then '末尾でなければ区切り文字,を追加
              
         nw &= ","


           End If

        Loop Until last

        TextBox1.Text = nw 'テキストボックスに区切り文字をを追加した文字列を表示


    End Sub
End Class


上記のプログラムは、テキストボックスに入力した文字列を、3文字ごとに,記号を入れて
表示するサンプルプログラムです。

Math.MinメソッドやSubstringメソッドなどの存在を知っておいて、かつそれらを活用して
目的とした動作をするプログラムを構築する力が必要なことがわかりました。
しかし、難しいものですね。
ちなみに、このプログラムを他のアルゴリズムで作成する方法があったらおしえてください。
何度もすみません。

投稿者 あにす  (社会人) 投稿日時 2009/1/31 10:34:33
String.Insert(Integer,String)

StringBuilder.Insert(Integer,String)
なんて如何でしょうか。
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
    Dim r As New System.Text.StringBuilder(Me.TextBox1.Text)
    For i As Integer = 3 To r.Length + (r.Length / 3) - 2 Step 4
        r.Insert(i, ",")
    Next
    Me.TextBox1.Text = r.ToString()
End Sub
投稿者 あにす  (社会人) 投稿日時 2009/1/31 11:11:21
すみません、ちょっとわかりにくい気がしたので書き直しました。
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
    Dim stp As Integer = 3
    Dim r As New System.Text.StringBuilder(Me.TextBox1.Text)
    For i As Integer = stp To r.Length + (r.Length / stp - 1) - 1 Step stp + 1
        r.Insert(i, ",")
    Next
    Me.TextBox1.Text = r.ToString()
End Sub

(r.Length / stp - 1)で","を挿入することによって増える文字数を計算してます。
その後の-1は末尾に","が追加されるのを防ぐためです。
stp + 1 の 1 は、ループ内で挿入した","の分もステップするためです。
投稿者 しょしん者  (社会人) 投稿日時 2009/1/31 19:16:15
有り難うございます。なるほど書き方にもいろいろなバリエーションがあるのですね。

でも、下記のコードなどは繰り返し学ぶことで考えつくものなのでしょうか?
愚鈍な頭では、解読するまでにしばし時間がかかりました。
For i As Integer = stp To r.Length + (r.Length / stp - 1) - 1 Step stp + 1
        r.Insert(i, ",")

いつか自力で考えたプログラムを作りたいと思っていますが、はるかに道は遠しです。
やはり、リファレンス本を普段から読み込んだり、実際に手を動かして学んでいくしか
ないのでしょうね。

投稿者 cupid  (社会人) 投稿日時 2009/1/31 21:27:38
> リファレンス本を普段から読み込んだり、実際に手を動かして学んでいく
> しかないのでしょうね

コホン、老婆心ながら、そんな事は無いと言って置きましょう。

自分は他人(ひと)のプログラムを読むのが嫌いだから、スレッドの最初に
書かれたソース見ても、実はあまり意味が分からなかった。
欲しい機能を説明する場合、処理前・処理後のサンプルを示して、こんな風に
したいと書くと分かりやすい場合もあります。
数学的に定理の定義を完備した文章で言われても何だこれはという気がするの
に似ています。

言語機能や、個々の基本的コントロール(Label、TextBox、Buttonなど)
一つ一つの挙動をよく理解すれば、おのずと見えてくるアルゴリズムも有ります。
短期間に効率よくプログラム作るにはサンプルの利用が早いですが、それだけ
では見えない「もの」もあるのは確かです。
まあ、異論ある人もあるかもしれませんが。
投稿者 あにす  (社会人) 投稿日時 2009/2/1 10:56:03
まずは何かを作り始めてみては如何でしょうか。何でもいいと思います。
その中で分からないことがあったらVisual Basic中学校の講座やGoogle等で根気よく調べて、それでも分からなければここで質問するといいと思います。
作れるように学ぶのではなくて、作る過程で必要になったことをその都度学んでいけばいいと思います。
結果完成に至らなくても、その過程で得るものは多いですよ。次に何かを作ろうとした時に必ず役に立ちます。
投稿者 しょしん者  (社会人) 投稿日時 2009/2/1 16:21:04
>作れるように学ぶのではなくて、作る過程で必要になったことをその都度学んでいけばいいと思います

なるほど、その通りですね。貴重なアドバイアス有り難うございます。