これが「再発アルゴリズム」でなければなりません。
"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を実行します。
実行例:
要求された実装:
これは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
英語は私の母国語ではありません印刷します。私のところで何か誤りがあれば、それを許してください。
たとえば、ユーザーが 'start server'と入力すると、タスクaを実行します。ユーザーが「開始」と入力しただけの場合は、「何を開始しますか」と言いたいと思います。またはエラーが発生しました...ユーザーが 'configure server'と入力してコンソール#の代わりにサーバー#に移動したいのならどんな指導も高く評価しています:-) – swam
まあ、私は各入力インデックスのすべての可能性を多次元配列にスローする必要があると思います。 – swam
配列の使用をやめるだけで、これを実装するのは完全には役に立ちません。あなたは辞書をレクサーとして実装することができますが、それは過度です。 KISSを賞賛するので、これは1週間ではなく5分間かかる。 –