とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

ひとりでんたく。- Visual Basic で電卓つく~る。その9 -

ひとりでんたく。- Visual Basic で電卓つく~る。その8 -←前回。

前回のあらすじ。

あは♪おかしくなってきたw

前回は電卓で言うC(クリア)を作りました。それだけです。(←こっちがあらすじ。)

さて、ここまで、さすがに思いついたまま部分的に作ったのでわやくちゃです。

なので・・・


とりあえずちゃんとつく~る!(なんだこれw)


前回の時点でのCalculator クラスのコードはこちらに置いておきました→こちら※ 見ると目から汗がでてくるのは気のせいではありません。

すでにうすうす気付いている点をば。

  • 1 → + → + って入力する→泣く。
  • 1 → + → . って入力する→泣く。
  • Decimal の範囲からはみ出たら→逝く。
  • 0 除算→逝く。
  • 無機能→カオス。

ちゃんとフローを書いてから作ればよかったですね。ええ、最初のエントリの時点で。orz

ま、しかたないのでここらで一度整理整頓。なによりもまず


エラーがでたら・・・もうクリアしてからじゃないとダメっぽく


します。「私たち、やり直せない?」ってことですね。(違

ん~どうしよっかな~?・・・エラー状態かどうかを判断するフィールドをつくりましょうか。それで管理しましょ♪

Private _isError As Boolean

で、以下のような条件式をやんちゃなメソッドの先頭に追加しておきます。

' エラー状態な私はほんとにダメ人間です。
If Me._isError Then

    Exit Sub
End If

んでもって、Clear メソッドで、Me._isError = False にするわけですね。あぁ楽チン。

ではまず、

  • 1 → + → + って入力する→泣く。

これからなんとかしましょう。現状では + を入力する度に計算処理をしてしまうのが問題ですね。先ほどのエラーの処理も踏まえて以下のように修正します。

Public Sub SetArithmeticOperation(ByVal op As Calculator.ArithmeticOperation)

    ' エラー状態な私はほんとにダメ人間です。     If Me._isError Then
        Exit Sub
    End If
    ' 次の入力待ちかつ、すでに演算子が入力されていたら     ' 演算子の置き換えだけにしよう。     If Me._nextInputIsNew AndAlso Me._operation <> ArithmeticOperation.None Then
        Me._operation = op
        Exit Sub
    End If
    ' 計算しちゃえ!     Me.Calculate()
    ' 計算してもエラーじゃなかったら覚えておく。     If Not Me._isError Then
        Me._memo = Decimal.Parse(Me.DisplayText)         Me._operation = op
        ' 次の入力は新しい入力ですからねー♪         Me._nextInputIsNew = True
    End If
End Sub

なんとなく・・・できたかな?つぎー!

  • 1 → + → . って入力する→泣く。

小数点を入力する処理で、新しい入力かどうかの判断ができていませんね。orz

コイツも修正修正っと。

Public Sub SetDecimalPoint()

    ' エラー状態な私はほんとにダメ人間です。     If Me._isError Then
        Exit Sub
    End If
    ' 中の人専用。     Dim newText As String
    ' 新しい入力なら "0" で     ' 前の入力の続きなら前の入力をセット。     ' ついでに次回の入力は新しい入力じゃないよ~♪ってことで。     If Me._nextInputIsNew Then
        newText = "0"         Me._nextInputIsNew = False
    Else
        newText = Me.DisplayText
    End If
    ' すでに小数点があったらなんにもしないの。     If newText.Contains("."Then
        Exit Sub
    Else
        newText &= "."
    End If
    Me.DisplayText = newText
End Sub

さて・・・エラーが出たらやり直しにはできました。でもエラー(例外発生ではない)になりません。だって Me._isError = True ってコード無いですもの。

  • Decimal の範囲からはみ出たら→逝く。
  • 0 除算→逝く。

計算しておかしなことになったらエラーですね。Calculate メソッドをちょっと修正してみます。ついでにエラーのときはエラーのメッセージを出すようにしましょうか。

Private Sub Calculate()

    ' エラー状態な私はほんとにダメ人間です。     If Me._isError Then
        Exit Sub
    End If
    ' 表示用のエラーメッセージ。     Dim errorMessage As String = String.Empty     ' 計算結果用のアレ。     Dim calcResult As Decimal

    Dim current As Decimal
    If Decimal.TryParse(Me.DisplayText, current) Then
        Try
            ' 四則演算でごにょごにょごにょ・・・             Select Case Me._operation
                Case ArithmeticOperation.Addition
                    calcResult = Decimal.Add(Me._memo, current)
                Case ArithmeticOperation.Subtraction
                    calcResult = Decimal.Subtract(Me._memo, current)
                Case ArithmeticOperation.Multiplication
                    calcResult = Decimal.Multiply(Me._memo, current)
                Case ArithmeticOperation.Division
                    ' 0 で割るとかできないから先にチェックしとく。                     If current = Decimal.Zero Then
                        Me._isError = True                         errorMessage = "Divide By Zero !? (´д`)"
                        Exit Select
                    End If
                    calcResult = Decimal.Divide(Me._memo, current)
                Case Else
                    Exit Sub
            End Select
        Catch ex As System.OverflowException ' オーバーフローはここで例外を捕まえておけばいいかな。
            Me._isError = True             errorMessage = "ヽ(`Д´)ノ Overflow!!"
        End Try
    Else
        Me._isError = True         errorMessage = "?? (゚Д゚≡゚Д゚) ??"
    End If

    ' エラーだったらメッセージを、ちゃんと計算できたら結果を表示。     If Me._isError Then
        Me.DisplayText = errorMessage
    Else
        Me.DisplayText = calcResult.ToString
    End If
End Sub

なんとなく想像で書いていますが、こんな感じかな?(テストしなさいよ。テストを。

で、その他もろもろ(?)ちょっとずつ修正したのをこちらに置いておきますね。

残るは・・・

  • 無機能→カオス。

・・・。



(∩゚д゚)アーアーきこえなーい

投稿日時 : 2007年7月6日 18:48

Feedback

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/06 18:58 ぽぴ王子

> ' 中の人専用。

中の人などいない!

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/06 19:01 とりこびと

ぽぴ王子 さん、コメントありがとうございます。

>中の人などいない!

ちゃんとリンクしてくださいw
http://d.hatena.ne.jp/torikobito/20061226/p1

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/06 19:33 ぽぴ王子

↑↑↓↓←→←→ABって入力する→無敵。

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/06 20:05 とりこびと

ぽぴ王子さん、コメントありがとうございます。

>↑↑↓↓←→←→AB

それなんてグラディウス?wwwwww

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/06 20:54 ぽぴ王子

グラディウスは最後ABじゃなくBAなのでこれは違うんですよ!
べっ、別に間違えたとかそんなんじゃないんだからねっ!(ツンデレ)

参考資料
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%8A%E3%83%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89

# re: ひとりでんたく。- Visual Basic で電卓つく~る。その9 - 2007/07/09 9:25 とりこびと

ぽぴ王子さん、コメントありがとうございます。


>グラディウスは最後ABじゃなくBAなのでこれは違うんですよ!

しまった!「ぽぴ王子さんに限って」な気持ちでコメントしてました・・・。
逆に油断してた・・・とも。orz

# ひとりでんたく。- Visual Basic で電卓つく~る。その10 - 2007/07/09 14:22 とりこびと ぶろぐ。

ひとりでんたく。- Visual Basic で電卓つく~る。その10 -

# モンクレール通販 2012/11/08 5:04 http://moncler.katsu-ie.com/

カッコいい!興味をそそりますね(^m^)

タイトル
名前
Url
コメント