Task

Given a prompt and a list containing a number of strings of which one is to be selected, create a function that:

 prints a textual menu formatted as an index value followed by its corresponding string for each item in the list;
 prompts the user to enter a number;
 returns the string corresponding to the selected index number.


The function should reject input that is not an integer or is out of range by redisplaying the whole menu before asking again for a number. The function should return an empty string if called with an empty list.

For test purposes use the following four phrases in a list:

   fee fie
   huff and puff
   mirror mirror
   tick tock

Note

This task is fashioned after the action of the Bash select statement.

 
Public Sub Main()
 
    Dim asMenu As String[] = ["fee fie", "huff And puff", "mirror mirror", "tick tock"]
    Dim sValuePrompt As String = "Please select one of the above numbers> "
    Dim sChoice As String
    Dim sFeedbackFormat As String = "You have chosen '&1'\r\n"
 
    sChoice = Menu(asMenu, sValuePrompt)
    If sChoice = "" Then
        Print "menu returned an empty string"
    Else
        Print Subst(sFeedbackFormat, sChoice)
    Endif
 
End
 
Private Function Menu(asChoices As String[], sPrompt As String) As String
 
    Dim sReturnValue As String = ""
    Dim sMenuLineFormat As String = "&1) &2"
    Dim sAnswer As String
    Dim iAnswer As Integer
    Dim iIndex As Integer = 0
    Dim sMenuItem As String
 
    If Not IsNull(asChoices) Then
        If asChoices.Count > 0 Then
            Do
                For iIndex = 0 To asChoices.Max
                    sMenuItem = asChoices[iIndex]
                    Print Subst(sMenuLineFormat, iIndex, sMenuItem)
                Next
 
                Print sPrompt
                Input sAnswer
 
                If IsNumber(sAnswer) Then
                    iAnswer = sAnswer
                    If (0 <= iAnswer) And (iAnswer <= asChoices.Max) Then
                        sReturnValue = asChoices[iAnswer]
                        Break
                    Endif
                Endif
            Loop
        Endif
    Endif
 
    Return sReturnValue
 
End
 