C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 電卓 1+2+3


(過去ログ 17 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■6249 / inTopicNo.1)  電卓 1+2+3
  
□投稿者/ 韋駄天 (1回)-(2007/08/07(Tue) 00:08:02)

分類:[VB.NET/VB2005] 

VB.NETで電卓を作りました。
普通の1回の四則演算までは出来ました。
ただ、1+2+3だとか1+3−4
のような連続した計算の仕方がわかりません。
かなり基礎的な問題なのかと思われますが、
自分にはよくわからないので
どなたかわかる方がいらっしゃったら
教えていただけると助かります。
引用返信 編集キー/
■6251 / inTopicNo.2)  Re[1]: 電卓 1+2+3
□投稿者/ アクア (46回)-(2007/08/07(Tue) 01:34:27)
アクア さんの Web サイト
2007/08/07(Tue) 01:37:20 編集(投稿者)


はじめましてアクアと申します。
# 私事ですが、皆さんから『お前が教えてやれ!』と言われてる気がしたので協力させていただきます。

本題ですが、提示なさっておられる文からの想像ですが、現在のコード上では
変数A(1回目の入力値)
変数B(2回目の入力値)
の2つの変数が用意されていると思います。

もしかしたら、今現在の韋駄天さんの頭の中では、
『 変数Cを用意しなければならないのか? 』
とお考えなのかもしれませんが、決してそうではなく、変数Aと変数Bにたいする考え方を

変数A(現在入力している値を入れる変数)
変数B(既に入力された値もしくは計算結果を入れる変数)

の様な考え方に切り替えたら、また一歩道が開けると思います。
引用返信 編集キー/
■6253 / inTopicNo.3)  Re[2]: 電卓 1+2+3
□投稿者/ Jitta (388回)-(2007/08/07(Tue) 07:45:32)
No6251 (アクア さん) に返信
> 2007/08/07(Tue) 01:37:20 編集(投稿者)
>
>
> はじめましてアクアと申します。
> # 私事ですが、皆さんから『お前が教えてやれ!』と言われてる気がしたので協力させていただきます。

ですね(笑)


アクアさんのホームページへ行って、ツラツラ読んでみると、答えに行き当たることでしょう。


まぁ、コピペはしてほしくないけど、多くの人が慣れている計算式で計算する計算機を作るのは、結構難しい...しっかりと、ケースの洗い出しと、設計を行ってください。
引用返信 編集キー/
■6276 / inTopicNo.4)  Re[1]: 電卓 1+2+3
□投稿者/ mあ (38回)-(2007/08/07(Tue) 12:53:18)
No6249 (韋駄天 さん) に返信
> VB.NETで電卓を作りました。
> 普通の1回の四則演算までは出来ました。
> ただ、1+2+3だとか1+3−4
> のような連続した計算の仕方がわかりません。


どえりやー長いけど、
TextBox1,TextBox2,Button1,Button2 4つ用意してコピペしてGO。
正負符号と掛け算・割り算が抜けています。アクアさんのHPは見たことありませんが、
これとはまったく異なるやり方で実装されているかもしれません。
以下の処理に、代入とか複合代入とか、単項演算子とか、if 文とか function とか、
加えて拡張していくと、簡単なマクロ言語が出来ます。で、出来合いの文法通りに実装
すると C# や VB.NET が出来ます。
Parse1() と Parse2() が互いに呼び合うのは理解しにくいかもしれませんが、m_var に
格納される種別コードを1つずつ順に追っていくとうっすらとなにやっているのかが
理解できそうなできなさそうな、頭がこんがらがってきそうで・・・・な感じです。
"後置記法"をWiki で下調べした上で見てみるとGoodですね。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub ClearText()
        TextBox1.Text = ""
        TextBox2.Text = ""
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ClearText()
    End Sub

    Private Class ParseException
        Inherits Exception
        Public Sub New()
            MyBase.New("Parse Error")
        End Sub
        Public Sub New(ByVal s As String)
            MyBase.New(s)
        End Sub
    End Class
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Init()
        GetChar()
        Dim answer As Var = Parse1()

        TextBox2.Text = CStr(answer.Value)




    End Sub

    Private Function Parse1() As Var
        Dim leftVal As Var = Parse2()
        Do While m_var.Code = CharType.C_ADD Or m_var.Code = CharType.C_SUB
            If m_var.Code = CharType.C_ADD Then
                GetChar()
                Dim rightVal As Var = Parse2()
                leftVal.Value = DirectCast(leftVal.Value, Integer) + DirectCast(rightVal.Value, Integer)
            Else
                GetChar()
                Dim rightVal As Var = Parse2()
                leftVal.Value = DirectCast(leftVal.Value, Integer) - DirectCast(rightVal.Value, Integer)
            End If
        Loop
        Return leftVal
    End Function

    Private Function Parse2() As Var
        If m_var.Code = CharType.C_LPAR Then
            GetChar()
            Dim val As Var = Parse1()
            If m_var.Code <> CharType.C_RPAR Then
                Throw New ParseException(") expected")
            Else
                GetChar()
                Return val
            End If
        Else
            Dim val As Var = m_var.Clone()
            GetChar()
            Return val
        End If
    End Function

    Private Structure Var
        Private m_cod As CharType
        Private m_val As Object
        Public Property Code() As CharType
            Get
                Return m_cod
            End Get
            Set(ByVal value As CharType)
                m_cod = value
            End Set
        End Property
        Public Property Value() As Object
            Get
                Return m_val
            End Get
            Set(ByVal value As Object)
                m_val = value
            End Set
        End Property

        Public Sub New(ByVal cod As CharType)
            m_cod = cod
            m_val = Nothing
        End Sub
        Public Sub New(ByVal cod As CharType, ByVal val As Object)
            m_cod = cod
            m_val = val
        End Sub
        Public Function Clone() As Var
            Return New Var(m_cod, m_val)
        End Function
    End Structure

    Private Enum CharType
        C_ADD
        C_SUB
        C_LPAR
        C_RPAR
        C_NUM
        C_EOS
        C_UNK
    End Enum

    Private m_pos As Integer = 0
    Private m_str As String
    Private m_lst As ArrayList
    Private m_var As New Var

    Private Sub Init()
        m_pos = 0
        m_str = TextBox1.Text
        m_lst = New ArrayList()

        m_lst.Add(New Var(CharType.C_UNK, "???"))

    End Sub

    Private Sub GetChar()

        m_var.Code = CharType.C_EOS

        Do While m_pos < m_str.Length
            Dim ch As Char = m_str.Chars(m_pos)
            Dim sNum As String = ""
            If ch >= "0" And ch <= "9" Then
                Try
                    Do While ch >= "0" And ch <= "9"
                        sNum = sNum + ch
                        m_pos = m_pos + 1
                        ch = m_str.Chars(m_pos) ''IndexOutOfBoundsException
                    Loop
                Catch ex As Exception
                    ''この例外は無視してOKよん
                End Try

                m_var.Value = CInt(sNum)
                m_var.Code = CharType.C_NUM
                Exit Sub
            End If

            If ch = "+" Then
                m_pos = m_pos + 1
                m_var.Code = CharType.C_ADD
                Exit Sub

            End If

            If ch = "-" Then
                m_pos = m_pos + 1
                m_var.Code = CharType.C_SUB
                Exit Sub

            End If

            If ch = "(" Then
                m_pos = m_pos + 1
                m_var.Code = CharType.C_LPAR
                Exit Sub

            End If

            If ch = ")" Then
                m_pos = m_pos + 1
                m_var.Code = CharType.C_RPAR
                Exit Sub

            End If

            If ch <> " " Then
                Throw New NotSupportedException(ch + " is not supported.")
            End If

            m_pos = m_pos + 1
        Loop
    End Sub


End Class

引用返信 編集キー/
■6543 / inTopicNo.5)  Re[1]: 電卓 1+2+3
□投稿者/ 魔界の仮面弁士 (382回)-(2007/08/17(Fri) 16:05:00)
No6249 (韋駄天 さん) に返信
> ただ、1+2+3だとか1+3−4
> のような連続した計算の仕方がわかりません。

Public Class Form1

 Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
  TextBox1.Text = "1+2+3"
  TextBox2.ReadOnly = True
 End Sub

 Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  TextBox2.Text = Calc(TextBox1.Text).ToString()
 End Sub

 Function Calc(ByVal expression As String) As Double
  Using table As New DataTable()
   table.Columns.Add("ans", GetType(Double), expression)
   With table.Rows.Add()
    If .IsNull("ans") Then
     Return Double.NaN
    Else
     Return DirectCast(.Item("ans"), Double)
    End If
   End With
  End Using
 End Function

End Class
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -