2016-04-01 11 views
0

私はコンソールウィンドウからユーザ入力を取得しようとしていて、分割してうまく動作する配列に分割しています。私は最近分裂について読んだ。私は分割インデックスの各位置で '入力'可能性をチェックするために以下の配列を作成しましたが、有効な入力のために各位置を実際にチェックする方法を理解することはできません。Visual Basic 2013 - コンソール入力トークン?

Dim l1args as Array = {"help","exit","start"} 'first position possibilities 
Dim l2args as Array = {"server","exit"} 'second position possibilities 

Console.Write("console# ") 
Dim input = Console.ReadLine() 
Dim tokens As String() = input.Split(CChar(" ")) 

誰でも私にガイダンスを教えてもらえますか?私は、ユーザー入力のコンボをチェックして、それを使って何かをしたいと思っています。その後、何の可能性が存在しないか、オフになっている場合、私は「認識されないコマンド」のようにコンソールにエラーメッセージを書きたい....

おかげで....

+0

たとえば、ユーザーが 'start server'と入力すると、タスクaを実行します。ユーザーが「開始」と入力しただけの場合は、「何を開始しますか」と言いたいと思います。またはエラーが発生しました...ユーザーが 'configure server'と入力してコンソール#の代わりにサーバー#に移動したいのならどんな指導も高く評価しています:-) – swam

+0

まあ、私は各入力インデックスのすべての可能性を多次元配列にスローする必要があると思います。 – swam

+1

配列の使用をやめるだけで、これを実装するのは完全には役に立ちません。あなたは辞書をレクサーとして実装することができますが、それは過度です。 KISSを賞賛するので、これは1週間ではなく5分間かかる。 –

答えて

0

これが「再発アルゴリズム」でなければなりません。

"start"は変数を取得する関数(何を開始するか)と考えるべきです。

この変数もコマンドであるため、「開始コマンド」を開始する前に実行する必要があります。

たとえば、 "start print 1" とすると、printは1を出力すると言うことができます。基本的にはprint 1の値を取得しています(この値は1です。 。コマンドは、Aは

:そして、あなたには「1」ユーザーにエラーMSGを作るがない場合は、1を開始します(1を開始

このように私はそれを行うような方法があるでしょう名前と必要な引数の数 たとえば、startコマンドの名前は "start"で、1つの引数が必要です。

またはコマンドのヘルプには "help"という名前が付いており、引数は0個必要です。

またはコマンドprintの名前は "print"で、引数は1つ必要です。

ここで、ユーザーが「print print chrome」コマンドを入力したとしましょう。 最初の単語を見て、開始が認識されたコマンドであることを確認します。次の単語を入力してコマンドとして実行し、結果をstartコマンドに渡します。次の言葉に行くと、これも認識されたコマンドなので、printコマンドの引数を取得する次のコマンドに行きます。ここでchromeは認識されていないコマンドなので、 chrome "(anythings else string、double ...)を指定すると、コマンドprintを引数" chrome "で実行した後、コマンドprintを実行した後にコマンドstartを実行します。

実行例: enter image description here

要求された実装:

これはvb.netでのコンソールアプリケーションです。 通常、すべてのクラスを1つのファイルに入れていますが、ここに投稿するには、それを行わなければなりませんでした。

は「9 10プリント和」コマンドを使用してみてください、これは19

Option Strict On 
Option Explicit On 
Module Module1 
    Public AllCommand As Dictionary(Of String, ConsoleCommand) 
    Sub Main() 
     GenerateAllCommands() 
     Dim UserCommand() As String 
     While True 
      UserCommand = Console.ReadLine().Split({" "c}, System.StringSplitOptions.RemoveEmptyEntries) 
      RunCommand(UserCommand, True, 0) 
     End While 
    End Sub 
    Public Function RunCommand(FullCommand() As String, IsFirst As Boolean, CommandIndex As Integer) As CommandReturnedValue 
     If CommandIndex > FullCommand.Length - 1 Then 
      Return Nothing 
     End If 
     Dim CurrentCommand As String 
     If FullCommand.Length = 0 Then 
      If IsFirst Then 
       Console.WriteLine("Error - Empty String is not a valid command") 
      End If 
      Return New CommandReturnedValue("", CommandIndex) 
     End If 
     CurrentCommand = FullCommand(CommandIndex).Trim().ToLower() 
     If CurrentCommand.Length = 0 Then 
      If IsFirst Then 
       Console.WriteLine("Error - Empty String is not a valid command") 
      End If 
      Return New CommandReturnedValue("", CommandIndex) 
     End If 
     Dim TheCommnad As ConsoleCommand 
     If AllCommand.ContainsKey(CurrentCommand) Then 
      TheCommnad = AllCommand.Item(CurrentCommand) 
      Dim TempArgs(TheCommnad.Args - 1) As CommandReturnedValue 
      Dim TempIndex As Integer = CommandIndex + 1 
      For i As Integer = 0 To TheCommnad.Args - 1 Step 1 
       If TempIndex > FullCommand.Length - 1 Then 
        Console.WriteLine("Error - Need more arguments for """ & TheCommnad.CommandName & """ Command, You entered " & i & " Arguments, This command need " & TheCommnad.Args & " Arguents") 
        Return New CommandReturnedValue("", CommandIndex) 
       End If 
       TempArgs(i) = RunCommand(FullCommand, False, TempIndex) 
       If TempArgs(i) Is Nothing Then 
        Console.WriteLine("Error - Need more arguments for """ & TheCommnad.CommandName & """ Command, You entered " & i & " Arguments, This command need " & TheCommnad.Args & " Arguents") 
        Return New CommandReturnedValue("", CommandIndex) 
       End If 
       If TempArgs(i).CommandIndex <> -1 Then 
        TempIndex = TempArgs(i).CommandIndex + 1 
       Else 
        TempIndex += 1 
       End If 
      Next 
      If TempArgs.Length = 0 Then 
       Return TheCommnad.DoCommand(TempArgs, CommandIndex) 
      Else 
       Return TheCommnad.DoCommand(TempArgs, TempArgs(TempArgs.Length - 1).CommandIndex) 
      End If 
     Else 
      If IsFirst Then 
       Console.WriteLine("Error - Unknown Command """ & CurrentCommand & """") 
      End If 
      Return New CommandReturnedValue(FullCommand(CommandIndex), CommandIndex) 
     End If 
    End Function 
    Public Sub GenerateAllCommands() 
     'NOTE - ALL COMMAND MUST BE LOWER CASE 
     AllCommand = New Dictionary(Of String, ConsoleCommand) 
     AllCommand.Add("help", New HelpCommand()) 
     AllCommand.Add("start", New StartCommand()) 
     AllCommand.Add("print", New PrintCommand()) 
     AllCommand.Add("sum", New SumCommand()) 
    End Sub 
End Module 
Public Class CommandReturnedValue 
    Public Value As String 
    Public CommandIndex As Integer 
    Public Sub New(Value As String, Optional index As Integer = -1) 
     Me.Value = Value 
     Me.CommandIndex = index 
    End Sub 
End Class 
Public MustInherit Class ConsoleCommand 
    Public ReadOnly CommandName As String 
    Public ReadOnly Args As Integer 
    Public Sub New(Name As String, args As Integer) 
     Me.CommandName = Name 
     Me.Args = args 
    End Sub 
    Public MustOverride Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue 
End Class 
Public Class StartCommand 
    Inherits ConsoleCommand 
    Public Sub New() 
     MyBase.New("start", 1) 
    End Sub 
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue 
     If System.IO.File.Exists(AllArgs(0).Value) Then 
      Shell(AllArgs(0).Value, AppWinStyle.NormalFocus) 
     Else 
      Console.WriteLine("Error - Unknown file (Start Command)") 
     End If 
     Return Nothing 
    End Function 
End Class 
Public Class HelpCommand 
    Inherits ConsoleCommand 

    Public Sub New() 
     MyBase.New("help", 0) 
    End Sub 
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue 
     Console.WriteLine("I see you tryed doing the help commnad ;)") 
     Console.WriteLine("Commands: ") 
     Console.WriteLine(" Start <FileName> - will try to start the <filename>") 
     Console.WriteLine(" help - will show a help list") 
     Console.WriteLine(" print <value> - will print (and return) <value>") 
     Return New CommandReturnedValue("Help Command", CommandIndex) 
    End Function 
End Class 
Public Class SumCommand 
    Inherits ConsoleCommand 
    Public Sub New() 
     MyBase.New("sum", 2) 
    End Sub 
    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue 
     Dim x As Integer 
     Dim y As Integer 
     Try 
      x = Convert.ToInt32(AllArgs(0).Value) 
     Catch ex As Exception 
      Console.WriteLine("Error - Arguments to sum must be an integer, """ & AllArgs(0).Value & """ is not an integer") 
      Return Nothing 
     End Try 
     Try 
      y = Convert.ToInt32(AllArgs(1).Value) 
     Catch ex As Exception 
      Console.WriteLine("Error - Arguments to sum must be an integer, """ & AllArgs(1).Value & """ is not an integer") 
      Return Nothing 
     End Try 
     Return New CommandReturnedValue((x + y).ToString, CommandIndex) 
    End Function 
End Class 
Public Class PrintCommand 
    Inherits ConsoleCommand 

    Public Sub New() 
     MyBase.New("print", 1) 
    End Sub 

    Public Overrides Function DoCommand(AllArgs() As CommandReturnedValue, CommandIndex As Integer) As CommandReturnedValue 
     Console.WriteLine("Print Command: """ & AllArgs(0).Value & """") 
     Return AllArgs(0) 
    End Function 
End Class 

英語は私の母国語ではありません印刷します。私のところで何か誤りがあれば、それを許してください。

+0

これは間違いなく理にかなっています。私はちょうどコードでこれを書くための最善の方法だと思っています。 If Then文? – swam

+0

可能なコマンドのより良い速度のために配列やハッシュテーブルを作ることができます(すべてのコマンドは引数の数と引数の数を持っています) (単語に分割された、ユーザによって入力された)コマンドで実行を開始すると、単語の数が必要な引数を見つけたら、配列の最初の単語(ハッシュテーブル)を検索し、コマンドはコマンドの値を返します。どこに戻る必要があるかを教えてくれるスタックが必要です。< - print < - 1 –

+0

とにかく小さな例を書くことができます:\ – swam