'============================================================== ' ' Functional BrackBoard for Win10 R 2025 ':Form1 Functional Engine ' Ver0.011 Copy Right Miyama. ' ' http://kazutomimiyama.sakura.ne.jp ' KazutomiMiyamaSub@gmail.com ' '============================================================== ' ' 複合関数の解析プログラム ' '============================================================== ' ' おおまかな論理流れ図 ' ' InputTXT ' RMVUnSuitableCHRTXT ' FuncAsOneCHRTXT ' SourceE'uationTXT ' AnalysisTXT ' BracketLogicTXT ' ' :FunctionAnalyze ' ' WatchSTR logic InputTXT_TextChanged <- InputTXT.text ' | : Change EachTimes ' v ' RMVUnSuitCHRSTR -> RMVUnSuitableCHRTXT.text ' | ' v v ' CreateCHRasFunc() <----- RMVUnSuitCHRSTR ' | ' <---------------> FuncAsOneCHRSTR -> FuncAsOneCHRTXT.text ' | ' V ' CHKEquationFormatSuit() -----------------------------> SourceEquationTXT.text ' v ' ExtractNumSTRToArr_declare ' NVoidFuncToSequenceSTR() ' & ' InputDataToBracketMemoryLogic() ' | ' | ' --------> [[Each FunctionBracket(Arr) and each proparty]] ' ' | ' v ' ExpressEquationResultAnalysis() -> AnalysisTXT.text ' & ' ExpressText_DrawPicDepthLogical() -> BracketLogicTXT.text ' -> BracketLogic Picture ' ' ----- ' XinputTXT.text ' v ' -----------> RealEngineFuncComplex() <> [[Each FunctionBracket(Arr)] ' /---< :Interface ' v ' CalcOutTXT.text ' ----- ' :Graphic ' ' GrapicForm. ' V ' x parameters region loop ' | ' |<-----loop-------> LogicForm.RealEngineFuncComplex() <> [[EachBrackt ARR]] ' v ' ' YpointData(arr some1000times step) ' ' |A ' V| Loop call ' ' GForm. >> Graphic Drawing ' '-------------------------------------------------------------- Option Explicit On Imports System Imports System.IO Imports System.Math Public Class Form1 Public FB(50) As FBGen 'FunctionalMemoryActiveBracket 'この書式ならエラーは出ない、FB()とポインタだけ宣言することは可能か、 '当座どうでもいい。 'Public NumSTRForNVoidFunc(50) As String '構造体の中に繰り込んだら、この宣言は無効にする Dim g 'as graphics'グラフィックス Dim p As Object '描画用ペンの色 Dim VacantCHR As String = "" Dim PeriodCHR As String = "." Dim CummaCHR As String = "," Dim OneByteSpace As String = " " Dim FrontBracketCHR As String = "(" Dim BackBracketCHR As String = ")" Dim RMVUnSuitableCHRSTR As String Dim FuncAsOneCHRSTR As String 'for log file-- Dim FSO As Object = CreateObject("scripting.filesystemobject") Dim WTS As StreamWriter Dim RTS As StreamReader 'キーアップキーダウンテストイベント:シフトキー認識 'Flags forKeyup keydown TSTevent For shift key recognization Dim KeyCodeToAvoidOperandFlagGlobal As Integer Dim ShiftKeyDiscoveredFlagGlobal As Boolean '============================================================== ' ' Form Load and Base Initializing ' '============================================================== Public Sub PicRefresh() g.Dispose() BraLogicPic.Refresh() g = BraLogicPic.CreateGraphics End Sub Public Sub BracketArrInit() Dim i As Integer For i = 0 To 50 FB(i) = New FBGen 'この各一毎の宣言は必要。 With FB(i) .Buf = 1 'NumSTRForNVoidFunc(i) = "0" '.NumSTRForNVoidFunc = "0"'2025renewal End With Next i End Sub Public Sub tuneLayout() '数値で調整すること、 Dim HRW As Double = 0.07 'HelpRate W/H Dim HRH As Double = 0.07 Me.BackColor = Color.LightBlue ' -----w h l t tuneSub(BracketLogicTXT, 1, HRH, 0, 0 * HRH) tuneSub(InputTXT, 1, HRH, 0, 5 * HRH) tuneSub(RMVUnSuitableCHRTXT, 1, HRH, 0, 4 * HRH) tuneSub(AnalysisTXT, 1, HRH, 0, 1 * HRH) tuneSub(FuncAsOneCHRTXT, 1, HRH, 0, 3 * HRH) tuneSub(SourceEquationTXT, 1, HRH, 0, 2 * HRH) tuneSub(CalcOUTTXT, 0.66, HRH, 0, 7 * HRH) tuneSub(XInputTXT, 0.2, HRH, 0.67, 7 * HRH) tuneSub(CalcBTN, 0.1, HRH, 0.87, 7 * HRH) tuneSub(CallGraphicBTN, 0.1, HRH, 0.87, 6 * HRH) tuneSub(ExitBTN, 0.1, HRH, 0, 6 * HRH) tuneSub(AnalyzeBTN, 0.6, HRH, 0.27, 6 * HRH) tuneSub(NoUseGraphFormCHK, 0.1, HRH, 0.1, 0.42) With NoUseGraphFormCHK .Checked = True .Text = "NoUseG &U" End With tuneSub(BraLogicPic, 1, 5 * HRH, 0, 8 * HRH) BraLogicPic.BackColor = Color.FromArgb(0, 0, 192) 'tabindex--- InputTXT.TabIndex = 0 AnalyzeBTN.TabIndex = 1 NoUseGraphFormCHK.TabIndex = 2 CallGraphicBTN.TabIndex = 3 XInputTXT.TabIndex = 4 CalcBTN.TabIndex = 5 CalcOUTTXT.TabIndex = 6 ExitBTN.TabIndex = 7 RMVUnSuitableCHRTXT.TabIndex = 8 FuncAsOneCHRTXT.TabIndex = 9 SourceEquationTXT.TabIndex = 10 AnalysisTXT.TabIndex = 11 BracketLogicTXT.TabIndex = 12 End Sub Public Sub tuneSub(cont As Object, 'cont:コントロール w As Double, h As Double, l As Double, t As Double) 'Foamに対する倍率とxy加減で場所を定義 Dim fw As Integer = Me.Width Dim fh As Integer = Me.Height With cont .width = w * fw .height = h * fh .left = l * fw .top = t * fh End With End Sub Public Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load BracketArrInit() '式のカッコ配列の初期化 With Me .Width = 500 .Height = 500 End With NoUseGraphFormCHK.Checked = True 'レイアウトでtrueにしている<< g = BraLogicPic.CreateGraphics PicRefresh() p = Pens.Yellow tuneLayout() RMVUnSuitableCHRTXT.Text = "RMVUnSuitableCHRTXT" XInputTXT.Text = "input X" End Sub '============================================================== ' ' Control Handler ' '============================================================== Public Sub AnalyzeBTN_Click(sender As Object, e As EventArgs) Handles AnalyzeBTN.Click PicRefresh() Call CreateCHRasFunc() InputTXT.SelectionLength = 0 WriteEqLogFile() End Sub Public Sub CalcBTN_Click(sender As Object, e As EventArgs) Handles CalcBTN.Click '単純計算、仕様は電卓風。 TakeActiveXInputTXT() CalcOUTTXT.Text = RealEngineAsFuncComplex(Val(XInputTXT.Text)) End Sub Public Sub TakeActiveXInputTXT() With XInputTXT .Text = RMVCRLF(.Text) .Text = NumCHRThrougH(.Text) End With End Sub Public Sub ExitBTN_Click(sender As Object, e As EventArgs) Handles ExitBTN.Click Form4.Close() '描画画面のアンロードも成功。 Me.Close() End Sub Public Sub WriteEqLogFile() Dim LogFileName As String = "EqLog.txt" Dim LogContentsSTR As String = VacantCHR 'lig contents If FSO.fileexists(LogFileName) = True Then RTS = New StreamReader(LogFileName) With RTS While .EndOfStream = False LogContentsSTR = LogContentsSTR + .ReadLine + vbCrLf End While .Close() End With End If WTS = New StreamWriter(LogFileName) WTS.Write(AnalysisTXT.Text + vbCrLf + LogContentsSTR) WTS.Close() End Sub Public Sub NoUseGraphFormCHK_ChackedChanged( sender As Object, e As EventArgs) Handles NoUseGraphFormCHK.CheckedChanged 'チェックは計算中はインターフェースを '表示しないために作った。 With CallGraphicBTN Select Case NoUseGraphFormCHK.Checked Case True .Enabled = False Case False .Enabled = True End Select End With 'チェックがオフだとボタンが表示されない、設定か 'ら試したらそうなっていた。考えてはいる。 'エネーブルのoffだと、ボタンは見えるが薄くなり、 '押せない設定。 End Sub Public Sub CallGraphicBTN_Click(sender As Object, e As EventArgs) Handles CallGraphicBTN.Click With Form4 '呼び出しも成功、 .Form_load() .Visible = True End With End Sub Public Sub InputTXT_TextChanged(sender As Object, e As EventArgs) Handles InputTXT.TextChanged Dim InputSTR As String Dim OutputString As String = VacantCHR Dim tmpCHR As String Dim lenSTR As Integer Dim i As Integer 'MessageBox.Show(vacantCHR)イベントは発生している '数字をカッコで保護する論理、 CallGraphicBTN.Enabled = False With InputTXT InputSTR = RMVCRLF(.Text) .text = InputSTR End With OutputString = VacantCHR lenSTR = Len(InputSTR) For i = 1 To lenSTR tmpCHR = Mid(InputSTR, i, 1) tmpCHR = illegalCHKtmpCHR(tmpCHR) If NumCHRCHK(tmpCHR) = True Then If i = 1 Then tmpCHR = FrontBracketCHR + tmpCHR End If If i = lenSTR Then tmpCHR = tmpCHR + BackBracketCHR End If End If OutputString = OutputString + tmpCHR Next i RMVUnSuitableCHRSTR = OutputString RMVUnSuitableCHRTXT.Text = OutputString End Sub '==key examination============================================= Public Sub remain_inputTXT_keydown( sender As Object, e As KeyEventArgs) 'Handles InputTXT.KeyDown KeyCodeToAvoidOperandFlagGlobal = e.KeyCode ShiftKeyDiscoveredFlagGlobal = e.Shift End Sub Public Sub remain_inputTXT_keyup( sender As Object, e As KeyEventArgs) 'Handles InputTXT.KeyUp ' テストルーチン。使っていない。 ' キーボードから演算子入力をはねる論理を '書こうとしたが、shiftキー合字押しは使え 'ない。shiftキーのスイッチは帰ってくるが、 'キーコードshiftシフトキーのものになって 'しまう。>出来た。 ' イベントdownとupの間で、グローバルフラ 'ッグのやり取りで実現。 ' アラート文字は+*・^半角ピリオドとマ 'イナスは通すようになっていた。小数と負数 'の都合。フルピッチとミニキーで動作が違う 'かもしれない。 ' 範囲指定など、数値入力のみを指定したい 'ときのために作ったのかもしれない。 Dim tmpINT As Integer tmpINT = KeyCodeToAvoidOperandFlagGlobal If ShiftKeyDiscoveredFlagGlobal = True Then Select Case tmpINT Case 186 'Keys.Add '"+"'公式アナウンスと実際のコードが違う。 Call CalcMSG() Case 187 'Keys.Multiply '"*" Call CalcMSG() End Select Else Select Case tmpINT Case 191 'Keys.Divide '"/" Call CalcMSG() Case 222 '"^" Call CalcMSG() End Select End If KeyCodeToAvoidOperandFlagGlobal = 0 ShiftKeyDiscoveredFlagGlobal = False End Sub Public Sub CalcMSG() '上記の論理のための文言を格納。 'MessageBox.Show( '"this program cannot recognize +*/^ kinds propaty on time calc." + '"please use Bracket logical segment or use regular sequence as example ") End Sub '--/key examination-------------------------------------------- '============================================================== ' Key Chr Input Alart sub function '============================================================== Public Function NumCHRCHK(CHRToNum As String) As Boolean '文字列ga数字kaboolで返事 '小数点も数字とみなす。スラッシュはデバイド演算子 'なので false。 Dim i As Integer If CHRToNum = PeriodCHR Then NumCHRCHK = True Else For i = 1 To 9 If CHRToNum = Chr(48 + i) Then NumCHRCHK = True GoTo escape End If Next i NumCHRCHK = False escape: End If End Function Public Function NumCHRThrougH(STR As String) As String 'for Xinputtxt under calc logic '数字dakewo toosu string de返事 '小数点も数字とみなす。スラッシュはデバイド演算子 'なので通さない。 Dim ChkFlag As Integer = 0 Dim i, j As Integer Dim tmpCHR As String = VacantCHR Dim stakeSTR As String = VacantCHR If 0 < Len(STR) Then For i = 1 To Len(STR) tmpCHR = Mid(STR, i, 1) If tmpCHR = PeriodCHR Then ChkFlag = 1 Else For j = 0 To 9 If tmpCHR = Chr(48 + j) Then ChkFlag = ChkFlag + 1 End If Next j End If If 0 < ChkFlag Then Else tmpCHR = VacantCHR End If stakeSTR = stakeSTR + tmpCHR ChkFlag = 0 Next i End If NumCHRThrougH = stakeSTR End Function Public Function illegalCHKtmpCHR(tmpCHR As String) As String ' 0-9 or +-*/^ sin cos tan e log ln is ok ' else result vacantCHR '厳密に数字、演算子と有名関数の文字列以外ははねる。 '関数。 Dim localBool As Boolean = False Dim i As Integer For i = 0 To 10 - 1 If Asc("0") <= Asc(tmpCHR) And Asc(tmpCHR) <= Asc("0") + 10 - 1 Then localBool = True End If Next i Select Case tmpCHR Case PeriodCHR : localBool = True '----- Case FrontBracketCHR : localBool = True Case BackBracketCHR : localBool = True Case "+" : localBool = True Case "-" : localBool = True Case "*" : localBool = True Case "/" : localBool = True Case "^" : localBool = True Case "s" : localBool = True Case "i" : localBool = True Case "n" : localBool = True Case "c" : localBool = True Case "o" : localBool = True Case "s" : localBool = True Case "t" : localBool = True Case "a" : localBool = True Case "n" : localBool = True Case "h" : localBool = True'for hyperboric:双曲線関数 Case "e" : localBool = True Case "l" : localBool = True Case "o" : localBool = True Case "g" : localBool = True Case "e" : localBool = True Case "l" : localBool = True'double-ryダブり Case "n" : localBool = True Case "x" : localBool = True '<必要かと思い作った。変数名は別でOK出しているのか?2025 End Select If localBool = True Then illegalCHKtmpCHR = tmpCHR Else ' MessageBox.Show("unsuitable charactor") illegalCHKtmpCHR = VacantCHR End If End Function Public Function RMVCRLF(STR As String) As String '汎用改行削除関数 Dim i As Integer Dim tmpCHR As String = VacantCHR Dim stakeSTR As String = VacantCHR If Not STR = VacantCHR Then For i = 1 To Len(STR) tmpCHR = Mid(STR, i, 1) Select Case tmpCHR Case vbCr tmpCHR = VacantCHR Case vbLf tmpCHR = VacantCHR End Select stakeSTR = stakeSTR + tmpCHR Next i End If RMVCRLF = stakeSTR End Function '*****AnalyzeBTN landing point****** '============================================================== ' ' Complex task zone. ' '============================================================== '============================================================== ' Complex task family 0/11 '============================================================== Public Sub CreateCHRasFunc() '---------------------------------------------------------- '関数としての記号。一文字暗号。 '初期化と解析マネージャを兼ねる。 Dim InnerSTR As String InnerSTR = RMVUnSuitablechrstr InnerSTR = ExtractNumSTRToArr_declareNVoidFuncToSequenceSTR(InnerSTR) InnerSTR = Replace(InnerSTR, "hsin", "$") InnerSTR = Replace(InnerSTR, "hcos", "&") 'sin firstly translate, then rised error cannot understand for this reason. InnerSTR = Replace(InnerSTR, "cos", "c") InnerSTR = Replace(InnerSTR, "tan", "t") InnerSTR = Replace(InnerSTR, "e", "e") InnerSTR = Replace(InnerSTR, "log", "l") InnerSTR = Replace(InnerSTR, "x", "x()") '----- InnerSTR = Replace(InnerSTR, "sin", "s") funcasonechrstr = InnerSTR FuncAsOneCHRTXT.Text = InnerSTR 'manage----- Call InputDataToBracketMemoryLogic() 'カッコ入れ子構造解析論理を呼ぶ。 Call ExpressEquationResultAnalysis() '関数解析論理を呼ぶ End Sub '============================================================== ' Complex task family 1/11 '============================================================== Public Function ExtractNumSTRToArr_declareNVoidFuncToSequenceSTR( mS As String) As String '---------------------------------------------------------- ' 文字列中の数字部分を切り出し、文字列の 'まま対応カッコインデックスと同じ変数に格 '納。 ' 構造体の設定を変えれば構造体に繰り込め 'る。 ' 関数としての文字列出力には、複合関数の '子関数としてn()という文字列を追加。 ' これは+-*/n(void)という意味。 ' カッコの中には代入変数と言う意味のxは 'いらない。 ' 実際の演算には、シーケンシャルに進む論 '理解析がその部分に来た時、同じインデック 'スの数字文字列を呼び出して、前カッコメモ 'リに代入する。 ' ' 演算子+-*/^ はオペランドと解釈したが英 '語は間違っているか? Dim Index As Integer Dim i, j As Integer Dim NumCHRNowDiscovered As Boolean Dim ContenueFlag As Boolean Dim K As Integer Dim ADDOneParticleFunctionFlexibleString As String Dim OutputString As String = VacantCHR Dim lenSTR As Integer Dim tmpCHR As String Dim doublePeriodErrorCHK As Boolean For K = 0 To 50 FB(K).NumSTRForNVoidFunc = VacantCHR '2025renewal 'NumSTRForNVoidFunc(K) = VacantCHR ''kouzoutai ni kurikonn da Next K lenSTR = Len(mS) ContenueFlag = False Index = 1 doublePeriodErrorCHK = False For i = 1 To lenSTR NumCHRNowDiscovered = False tmpCHR = Mid(mS, i, 1) If tmpCHR = PeriodCHR Then NumCHRNowDiscovered = True If doublePeriodErrorCHK = True Then MessageBox.Show( "文字列中に二回小数点ピリオドがあります。" + vbCrLf + "over 2 times of Periods existing on number claster" ) ', vbExclamation) tmpCHR = VacantCHR REM stop Else doublePeriodErrorCHK = True REM NumCHRNowDiscovered = True End If Else If tmpCHR = BackBracketCHR Then doublePeriodErrorCHK = False Else For j = 0 To 9 If tmpCHR = Chr(48 + j) Then NumCHRNowDiscovered = True GoTo escape End If Next j REM --No num chr hit------ NumCHRNowDiscovered = False End If escape: End If REM --- If NumCHRNowDiscovered = True Then ContenueFlag = True 'NumSTRForNVoidFunc(Index) = NumSTRForNVoidFunc(Index) + tmpCHR With FB(Index) '2025renewal .NumSTRForNVoidFunc = .NumSTRForNVoidFunc + tmpCHR End With MessageBox.Show("文字列を変換中です" + vbCrLf + "number charactor now translating ...") Else ADDOneParticleFunctionFlexibleString = VacantCHR If ContenueFlag = True Then ADDOneParticleFunctionFlexibleString = "n()" Index = Index + 1 ContenueFlag = False End If OutputString = OutputString + ADDOneParticleFunctionFlexibleString + tmpCHR End If Next i ExtractNumSTRToArr_declareNVoidFuncToSequenceSTR = OutputString End Function '============================================================== ' Complex task family 2/11 '============================================================== Public Sub InputDataToBracketMemoryLogic() '---------------------------------------------------------- '数式から文字、数字を切り出し、 'カッコ構造体のパラメーター群に格納 Dim i, Index As Integer Dim WaterFloat As Integer Dim inTextSTR As String Dim lenSTR As Integer Dim tmpCHR As String Dim FuncIndex As Integer Dim NumSTRArrRefCounter As Integer Dim tmpCalcOperandKindSTR As String Dim tmpFunctionKindSTR As String inTextSTR = FuncAsOneCHRSTR inTextSTR = CHKEquationFormatSuit(inTextSTR) '--initialize----------- For Index = 0 To 50 Step 1 With FB(Index) .CalcOperandKind = VacantCHR .FunctionKind = "v" 'vacant function .SubConstantParameter = 0 .Open = True .Discovered = False 'If Index = 0 Then これを組み込めば下の記述が必要ないはず。 '.Depth = 0 ただしまずはプログラムとしてのクローン ' コピーを作ること。 'End If よくみると厳密には記述がちがう。 ' おそるおそるfb(0)コメントアウトした。 ' 今のところ問題なし。2025 .Buf = 0 .CalcOperandKind = "+" 'FunctionKind As String 'SubConstantParameter As Integer 'Open As Boolean 'Discovered As Boolean .Depth = 0 .CloseBracketBufFlagByOnceMemoryMotherEd = False End With Next Index ' ----- 'With FB(0) 'comment out 2025 '.CalcOperandKind = "+" '.FunctionKind = "v" '.SubConstantParameter = 0 '.Open = True '.Discovered = False '.Depth = 0 'End With '------------------------ lenSTR = Len(inTextSTR) WaterFloat = 0 FuncIndex = 0 NumSTRArrRefCounter = 1 For i = 1 To lenSTR tmpCHR = Mid(inTextSTR, i, 1) 'tmpCalcOperandKindSTR = "+" 'tmpFunctionKindSTR = "v" ' この二つは解除する必要があるかもしれな 'い。<ない、ループで初期化してあるから問 '題ない。 ' カッコだけあって未代入の構造体配列は都 '合+v() カッコ内はヌル:と表現されるべき '関数になるから。 ' その場合は、+v(+v( .....))という最大 '50階層の数値的には意味のない複合関数と 'して解釈される ' このプログラムの思想は、a+bといった和 '算的平等を認めない。そのような悪液質の構 '造では論理が流れて行かないから。 ' 上のvacant関数の連続は ' ' 0+0+0+ ・・・ ' ' という計算を意味する。 ' また ' ' 3+4+7+10は ' ' +n(+n(+n(+n()))) ' ' と解釈され、 ' ' この式の、都合前カッコに配列としてのメ 'モリが割り当てられ、そのインデックスの順 'に、数値:正確にはその文字列 ' ' 3,4,7,10 が格納される。 ' ' これならvを廃止して、n関数に統一し、数 '値0を代入してもいいような気もする。 If CHKOperandSuit(tmpCHR) = True Then tmpCalcOperandKindSTR = tmpCHR End If 'stop If CHKFunctionSuit(tmpCHR) = True Then tmpFunctionKindSTR = tmpCHR End If If tmpCHR = FrontBracketCHR Then FuncIndex = FuncIndex + 1 'new next Bracket func 'WaterFloat = WaterFloat + 1 'into deep 1step logical With FB(FuncIndex) WaterFloat = WaterFloat + 1 .Depth = WaterFloat 'bufferopened = True .Discovered = True .CalcOperandKind = tmpCalcOperandKindSTR .FunctionKind = tmpFunctionKindSTR .SubConstantParameter = 0 If tmpFunctionKindSTR = "n" Then ' number to same number function for logical perspectivity .SubConstantParameter = Val(FB(NumSTRArrRefCounter).NumSTRForNVoidFunc) '2025renewal 'Val(NumSTRForNVoidFunc(NumSTRArrRefCounter)) NumSTRArrRefCounter = NumSTRArrRefCounter + 1 End If End With End If If tmpCHR = BackBracketCHR Then WaterFloat = WaterFloat - 1 'float 1 step to shallow End If Next i Call ExpressText_DrawPicDepthLogical(FuncIndex) End Sub '============================================================== ' Complex task family 3/11 '============================================================== Public Function CHKEquationFormatSuit(InputSTR As String) As String '---------------------------------------------------------- ' ==十年前の文言===== '(+m()+m()+m()) is to '(+m(+m(+m())) '悪平等は認めない<この一言だけ今年2025 ' pmsctel=plus /minus sin cos tan e log 'after(, +-*/ And pmsctel Or ) Bracket. ' front ) Bracket nessary ) Bracket 'reigai (pmsctel ha (+pmsctel 'x は無視する。 Dim forCHKstring As String Dim i As Integer Dim tmpCHR As String Dim lenSTR As String Dim ADDOneParticleFunctionFlexibleString As String Dim subOne As String Dim OutputString As String = VacantCHR Dim frontbrainteger As Integer Dim JustbeforeStageBackBracketFlag As Boolean Dim JustbeforeStageFrontBracketFlag As Boolean Dim CHKFrontBracketIndex As Integer Dim BracketPairCounter As Integer lenSTR = Len(InputSTR) CHKFrontBracketIndex = 0 JustbeforeStageBackBracketFlag = False JustbeforeStageFrontBracketFlag = True BracketPairCounter = 0 For i = 1 To lenSTR ADDOneParticleFunctionFlexibleString = VacantCHR subOne = VacantCHR tmpCHR = Mid(InputSTR, i, 1) 'If tmpCHR = "x" Then 'subOne = ()" 'CHKFrontBracketIndex = i 'JustbeforeStageFrontBracket = False 'JustbeforeStagebackBracket = True 'End If If tmpCHR = BackBracketCHR Then BracketPairCounter = BracketPairCounter - 1 If JustbeforeStageFrontBracketFlag = True And CHKFrontBracketIndex = i - 1 Then If 0 < i - 2 Then If Not Mid(InputSTR, i - 2, 1) = "n" Then REM ADDOneParticleFunctionFlexibleString = "+x()" End If End If End If JustbeforeStageBackBracketFlag = True JustbeforeStageFrontBracketFlag = False CHKFrontBracketIndex = i Else If tmpCHR = FrontBracketCHR Then BracketPairCounter = BracketPairCounter + 1 If CHKFrontBracketIndex = i - 2 Then If CHKOperandSuit(Mid(InputSTR, i - 1, 1)) = True Then ADDOneParticleFunctionFlexibleString = "v" End If End If If CHKFrontBracketIndex = i - 1 Then If JustbeforeStageFrontBracketFlag = True Then ADDOneParticleFunctionFlexibleString = "+v" End If If JustbeforeStageBackBracketFlag = True Then ADDOneParticleFunctionFlexibleString = "*v" End If JustbeforeStageFrontBracketFlag = True JustbeforeStageBackBracketFlag = False End If JustbeforeStageFrontBracketFlag = True JustbeforeStageBackBracketFlag = False CHKFrontBracketIndex = i 'arienai...... 'ADDOneParticleFunctionFlexibleString="*v" Else Select Case CHKFrontBracketIndex Case i - 1 If CHKOperandSuit(tmpCHR) = False Or CHKFunctionSuit(tmpCHR) = True Then If JustbeforeStageFrontBracketFlag = True Then ADDOneParticleFunctionFlexibleString = "+" End If If JustbeforeStageBackBracketFlag = True Then ADDOneParticleFunctionFlexibleString = "*" End If 'CHKFrontBracketIndex = CHKFrontBracketIndex + 1 End If Case i - 2 If CHKFunctionSuit(tmpCHR) = False Or tmpCHR = FrontBracketCHR Then ADDOneParticleFunctionFlexibleString = "v" 'CHKFrontBracketIndex = CHKFrontBracketIndex + 1 End If Case i - 3 If Not tmpCHR = FrontBracketCHR Then ADDOneParticleFunctionFlexibleString = FrontBracketCHR End If CHKFrontBracketIndex = 0 End Select End If End If OutputString = OutputString + ADDOneParticleFunctionFlexibleString + tmpCHR + subOne Next i If BracketPairCounter = 0 Then 'SourceEquationTXT.Text = OutputString Else MessageBox.Show("かっこの前後が一致しません。" + vbCrLf + "Bracket pair mis match.") End If SourceEquationTXT.Text = OutputString '2025 add GoTo jump errorescape: MessageBox.Show("インデックスにかかわるエラーが発生しました。" + vbCrLf + "error:" + CStr(i)) jump: CHKEquationFormatSuit = OutputString End Function Public Function CHKOperandSuit(CHR As String) As Boolean '文字が演算子かどうかを判別する。チェック用。 Dim CHKBool As Boolean = False Select Case CHR 'Case vacantCHR : CHKBool = True Case "+" : CHKBool = True Case "-" : CHKBool = True Case "*" : CHKBool = True Case "/" : CHKBool = True Case "^" : CHKBool = True End Select CHKOperandSuit = CHKBool End Function Public Function CHKFunctionSuit(CHR As String) As Boolean '単純化された文字が関数に相当するかどうか振り分け Dim CHKBool As Boolean = False Select Case CHR 'sin cos tan Case "s" : CHKBool = True Case "c" : CHKBool = True Case "t" : CHKBool = True 'hyperboric Case "$" : CHKBool = True Case "&" : CHKBool = True 'e^n Case "e" : CHKBool = True 'log Case "l" : CHKBool = True 'x=x Case "x" : CHKBool = True ' Case "n" : CHKBool = True 'vacant:const=const Case "v" : CHKBool = True End Select CHKFunctionSuit = CHKBool End Function '============================================================== ' Complex task family 4/11 '============================================================== Public Sub ExpressEquationResultAnalysis() '---------------------------------------------------------- '複合関数の解析結果を式として専用txtboxに表示。 Dim i As Integer Dim OutputString As String Dim NextDepth As Integer Dim XNumDepthTune As Integer Dim BackBracketStep As Integer Dim FrontBracketSTR As String 'parameter,not constCHR, Dim BackBracketSTR As String 'これも '----- OutputString = VacantCHR For i = 1 To 50 - 1 Step 1 'stepオプションは自然数でもなくてもよいが、 'その時は実数としてsingleやdoubleを指定する必要もある。 If FB(i).Discovered = True Then With FB(i + 1) If .Discovered = False Then NextDepth = 1 Else NextDepth = .Depth End If End With With FB(i) '--xNumSTRfront and backtune If .FunctionKind = "n" Or .FunctionKind = "x" Then XNumDepthTune = 0 ' -1 FrontBracketSTR = VacantCHR Else XNumDepthTune = 0 FrontBracketSTR = FrontBracketCHR End If '--backBracket realtune-- BackBracketStep = .Depth _ - NextDepth + XNumDepthTune If 0 < BackBracketStep Then BackBracketSTR = AddBackBracket(BackBracketStep) Else BackBracketSTR = VacantCHR End If '--each stake------ OutputString = OutputString + .CalcOperandKind _ + MakeFuncKindSTR(i) + FrontBracketSTR + BackBracketSTR End With End If Next i AnalysisTXT.Text = OutputString End Sub '============================================================== ' Complex task family 5/11 '============================================================== Public Function MakeFuncKindSTR(i As Integer) As String '---------------------------------------------------------- '一文字に暗号化した関数名から、表示用文字列を再構成する。 Dim tmpSTR As String = VacantCHR If i < 0 Or 50 < i Then MessageBox.Show("かっこの数は50個までです。" + vbCrLf + "value is illegal.") Stop Else With FB(i) tmpSTR = .FunctionKind Select Case .FunctionKind Case "n" : tmpSTR = CStr(Val(.SubConstantParameter)) Case "x" ': tmpSTR = vacantCHR donothing<空白文字ではなく、「X」を返す仕様か? Case "v" : tmpSTR = VacantCHR Case "s" : tmpSTR = "sin" Case "c" : tmpSTR = "cos" Case "t" : tmpSTR = "tan" Case "$" : tmpSTR = "hsin" Case "&" : tmpSTR = "hcos" Case "e" : tmpSTR = "e" Case "l" : tmpSTR = "log" End Select End With End If MakeFuncKindSTR = tmpSTR End Function '============================================================== ' Complex task family 6/11 '============================================================== Public Function AddBackBracket(i As Integer) As String '---------------------------------------------------------- ' 文字列が数字で終わっている場合は、後ろ 'カッコでくるむ、で理解はいいのか。 ' 複数後ろカッコを追加する仕様だから、順 '迅論理の結びである可能性。いや、想いだし 'た。そうだった。論理的なピリオド。論理は '簡単だがそれなりに重要。 Dim tmpSTR As String = VacantCHR Dim j As Integer If i < 1 Then ' no nothing Else tmpSTR = VacantCHR For j = 1 To i tmpSTR = tmpSTR + BackBracketCHR Next j End If AddBackBracket = tmpSTR End Function '*****CalcBTN landing point****** '============================================================== ' Complex task family 7/11 '============================================================== Public Function RealEngineAsFuncComplex(X As Double) As Double '---------------------------------------------- '格納された序列論理によって、複合関数として機能する部分、 '動作エンジンにあたる。 Dim Index As Integer Dim uLi As Integer 'Until LimitIndex Dim BeforeFrontBracketIndex As Integer Dim NextFrontBracketIndex As Integer Dim j, K As Integer 'lastindex=50 For j = 0 To 50 Step 1 With FB(j) .Open = True .CloseBracketBufFlagByOnceMemoryMotherEd = False .Buf = 0 End With Next j '----- Index = 1 again: With FB(Index) 'If NoUseGraphFormCHK.Checked = False Then 'MessageBox.Show( 'CStr(Index) + vbCrLf + 'CStr(.Depth) + vbCrLf + '.CalcOperandKind + vbCrLf + '.FunctionKind + vbCrLf + 'CStr(.Buf) + vbCrLf ' ) 'End If End With ' ここでいろいろやっている。すくなくとも ' すべてのbufをindex=0のメモリに足し終わ 'るまで、関数としての外部出力はできない。 If Index = 0 Then RealEngineAsFuncComplex = FB(Index).Buf Else BeforeFrontBracketIndex = DiscoverBackOpenIndex(Index) NextFrontBracketIndex = DiscoverNextOpenIndex(Index) If BeforeFrontBracketIndex < -1 Then MessageBox.Show("BeforeFrontBracketIndex error" + CStr(BeforeFrontBracketIndex)) Stop End If If NextFrontBracketIndex < -1 Then '? <0 MessageBox.Show("NextFrontBracketIndex error" + CStr(NextFrontBracketIndex)) Stop End If '----- ' インデックス書き換え、また別に引数代入 'のためwithステートメントは使えないよ。 If FB(Index).Open = True Then If NextFrontBracketIndex = -1 Then FB(Index).Open = False Call givesOnesResultMemoryToJustBeforeFrontBracketMemoryBuffer( BeforeFrontBracketIndex, Index, X) 'stop Index = BeforeFrontBracketIndex Else If FB(Index).Depth < FB(NextFrontBracketIndex).Depth Then 'do nothing 'stop Index = NextFrontBracketIndex '<これとか Else FB(Index).Open = False Call givesOnesResultMemoryToJustBeforeFrontBracketMemoryBuffer( BeforeFrontBracketIndex, Index, X) If FB(Index).Depth = FB(NextFrontBracketIndex).Depth Then 'stop Index = NextFrontBracketIndex End If If FB(Index).Depth > FB(NextFrontBracketIndex).Depth Then '? 'stop Index = BeforeFrontBracketIndex End If End If End If Else 'FB(Index).Open = False phaise. 'stop Index = NextFrontBracketIndex End If GoTo again End If 'End With <使えないよ。 ' 自分の計算が終わったあと、値を前のカッ 'コメモリに与えようとして、インデックスを '一つずつさかのぼる。 ' ルーチン計算終了の子関数は閉じているフ 'ラグを立てているので、オープンを示してい 'る親カッコまでさかのぼる。 ' オープンしている親カッコに、自らの定義 'された子関数と演算子を介して、親カッコメ 'モリの値と融合させる。 ' 処理が終了したら、自身のバッファを空に 'し、処理終了のフラグを立てる。:クローズ。 ' ' 基本的な論理使用は、最初はすべての子関 '数がオープンのフラグ : 計算可能、計算待 'ちのフラグを立てている。 ' 自分のインデックスよりより深いインデッ 'クスが隣にあれば、自分を演算せずにインデ 'ックスを一つインクリメントして先に進む。 'つまり、潜れるうちはどんどん先に進む。 ' 海溝の底に到達したら、もう浮かぶしかな 'いので、その時点の子関数を演算し、インデ 'ックスをデクリメントする。 ' つまりインデックスを進むたび潜ってきた 'のであるから、インデックスを戻るというこ 'とは論理を浮上することを意味する。 ' ' 手前の法面にある子関数を全部演算した時 'は海溝の反対側にある法面の子関数を今度は '下側から演算していく。 ' 手前の法面の子関数は計算終了のクローズ 'フラグを立てているので、ながれこむ土砂に 'よって地背斜のように谷が埋まり、 ' 演算することにより、論理的に埋めていき、 '次にはむかい側の海山山頂に達する。 ' むかいがわの山頂を越えたらまた下り坂な 'ので、ころがるように潜水する、 ' ということはまたインデックスをつぎつぎ 'にインクリメントしていき、複合関数ののお 'しりに、すこしずつ近づいていく。わくわく。 '<? End Function '============================================================== ' Complex task family 8/11 '============================================================== Public Function DiscoverBackOpenIndex(I As Integer) As Integer '---------------------------------------------- '後ろのバッファがオープンしているブラケット番号を探す。 Dim K As Integer If I < 0 Or 50 < I Then K = -3 Else If I = 0 Then K = -2 Else For K = I - 1 To 0 Step -1 'while de If K = -1 Then 'FB().discovered=false then K = -1 GoTo escape Else 'discovered=true. If FB(K).Open = True Then 'first open Bracket-- GoTo escape End If End If Next K escape: End If End If DiscoverBackOpenIndex = K End Function '============================================================== ' Complex task family 9/11 '============================================================== Public Function DiscoverNextOpenIndex(I As Integer) As Integer '-------------------------------------------------------- '前のバッファがオープンしているブラケット番号を探す。 Dim K As Integer If I < 0 Or 50 < I Then K = -3 Else If 50 = I Then K = -2 Else For K = I + 1 To 50 Step 1 If FB(K).Discovered = False Then K = -1 GoTo escape Else 'discovered=true If FB(K).Open = True Then 'first open bracket-- GoTo escape End If End If Next K escape: End If End If DiscoverNextOpenIndex = K End Function '============================================================== ' Complex task family 10/11 '============================================================== Public Sub givesOnesResultMemoryToJustBeforeFrontBracketMemoryBuffer( Mother As Integer, d As Integer, x As Double) '重要 自分の持っている演算結果を前のフロ 'ントブラケットメモリーに渡す Dim tmpBuf As Double With FB(d) 'If .CloseBracketBufFlagByOnceMemoryMotherEd = False Then 'tmpBuf = x 'Else tmpBuf = .Buf 'End If Select Case .FunctionKind 'Case "" 'tmpBuf = (tmpBuf) Case "s" : tmpBuf = Sin(tmpBuf) Case "c" : tmpBuf = Cos(tmpBuf) Case "t" : tmpBuf = Tan(tmpBuf) '--hsin--- Case "$" '--proof overflow style--- If 700 < tmpBuf Then tmpBuf = 700 tmpBuf = Sinh(tmpBuf) '(Exp(tmpBuf) - Exp(-tmpBuf)) * 0.5 '--hcos--- Case "&" If 700 < tmpBuf Then tmpBuf = 700 tmpBuf = Cosh(tmpBuf) '(Exp(tmpBuf) + Exp(-tmpBuf)) * 0.5 Case "e" If 700 < tmpBuf Then tmpBuf = 700 tmpBuf = Exp(tmpBuf) Case "l" 'small L If tmpBuf = 0 Then tmpBuf = 1 If tmpBuf < 0 Then tmpBuf = tmpBuf - 1 tmpBuf = Log(tmpBuf) 'vacant Bracket and Number Constant asd simple x to input. Case "v" tmpBuf = tmpBuf 'constant function +n is a especial case. Case "n" If .CloseBracketBufFlagByOnceMemoryMotherEd = True Then tmpBuf = 0 Else tmpBuf = tmpBuf + FB(d).SubConstantParameter End If Case "x" If .CloseBracketBufFlagByOnceMemoryMotherEd = True Then tmpBuf = 0 Else tmpBuf = x End If '--recognizing logicends.--- End Select End With With FB(Mother) Select Case FB(d).CalcOperandKind 'Case "" 'tmpBuf = .Buf + tmpBuf Case "+" tmpBuf = .Buf + tmpBuf'.buf とtmpbuf 逆じゃないか?恐いので現状維持、 Case "-" tmpBuf = .Buf - tmpBuf'最終的に代入しているから、 Case "*" tmpBuf = .Buf * tmpBuf'これでいい? Case "/" If tmpBuf = 0 Then tmpBuf = 1 Else tmpBuf = .Buf / tmpBuf End If Case "^" If .Buf <= 0 And Not tmpBuf = Int(tmpBuf) Then '条件がよくわからない。多分吟味している。 tmpBuf = 0 '小数と? End If tmpBuf = .Buf ^ tmpBuf End Select 'Stop .Buf = tmpBuf 'ここで代入、 .CloseBracketBufFlagByOnceMemoryMotherEd = True End With End Sub '============================================================== ' Complex task family 11/11 '============================================================== Public Sub ExpressText_DrawPicDepthLogical(Index As Integer) '---------------------------------------------------------- 'カッコ関数の相対的な深さを図に描く。 Dim i As Integer Dim tmpCHR As String = VacantCHR Dim tmpSTR As String = VacantCHR Dim IndexStepWidth As Double Dim MostDeep As Integer Dim j, K As Integer Dim DepthStepHeight As Double IndexStepWidth = Int(BraLogicPic.Width / (Index + 1)) MostDeep = 0 For j = 0 To Index If j = 0 Then K = 0 Else K = j - 1 End If If FB(j).Depth > FB(K).Depth Then '計算範囲をステップ命令を使って小刻みにしたり '負数へ繰り下がったりしていた。未検証2025。 MostDeep = FB(j).Depth End If Next j DepthStepHeight = Int(BraLogicPic.Height / (MostDeep + 1)) PicRefresh() 'g.Image = Nothing 'Clear() 'このメソッドは使えないVB2017 For i = 0 To Index With FB(i) '描画オブジェクト書式再確認 g.DrawEllipse(p, CInt(IndexStepWidth * i), CInt(DepthStepHeight * .Depth), 10, 10) tmpSTR = tmpSTR + CStr(i) + ":" + .CalcOperandKind + .FunctionKind + CStr(.SubConstantParameter) + OneByteSpace '+ vbCrLf 数式用横長テキストなので改行いらない End With Next i BracketLogicTXT.Text = tmpSTR End Sub '============================================================== ' /Complex Trunk's End '============================================================== Public Sub DrawGraphicsTest() '描画テストの残骸 Dim x, y As Double Dim tmpSTR As String Dim px, py As Integer Dim CHKINT As Integer PicRefresh() tmpSTR = VacantCHR MessageBox.Show(CStr(BraLogicPic.Height)) For x = -1 To 1 Step 0.1 'y = Sin(x) 'test y = RealEngineAsFuncComplex(x) tmpSTR = tmpSTR + CStr(x) + " " + CStr(y) + vbCrLf With BraLogicPic CHKINT = 0 px = CInt((x + 1) * .Width / 2) py = CInt((1 - y) * .Height / 2) If px <= 0 Then CHKINT = CHKINT + 1 If .Width < px Then CHKINT = CHKINT + 1 If py <= 0 Then CHKINT = CHKINT + 1 If .Height < py Then CHKINT = CHKINT + 1 End With g.DrawEllipse(Pens.Black, px, py, 4, 4) Next x CalcOUTTXT.Text = tmpSTR End Sub '============================================================== ' Class as a Functinal Bracket memory '============================================================== Public Class FBGen '情報の束に見立てた前カッコという構造体。 Public Buf As Double ' Public NumSTRForNVoidFunc As String ' n(void)関数用の数値文字列格納を想定。 ' 現在は構造体とインデックスがおなじ外部 'の文字列配列。 ' 構造体の中に入れると演算のためのカッコ 'に従属する内部メモリと区別がつかなくなる '恐れ。<結局繰り込んだ。2025 ' 定義概念では全く同じもの。 ' なぜかというと、n(void)は自分の中に下 '位演算としての子プロセス関数を持たないの 'で、 ' nの文字の後ろの、前カッコが抱えるメモ 'リは下位演算の加減乗除修飾を受けないから。 Public CalcOperandKind As String Public FunctionKind As String Public SubConstantParameter As Double Public Open As Boolean Public Discovered As Boolean Public Depth As String Public CloseBracketBufFlagByOnceMemoryMotherEd As Boolean End Class End Class '============================================================== ' ' End of File :Form1: ' '==============================================================