asp classic : checking values in an array

2019-09-13 09:35发布

问题:

I am making a simple questionnaire for a client in Classic ASP.

The idea is that there will be 10 questions. The user registers and is being sent to the first question. When this is answered they move on to the 2nd question etc. Questions can be skipped and returned to at a later date, and each question can only be answered once.

I have a comma separated list in the database of each question a user has answered.

So, a user logs in and an array is created with the list of answered questions.

What would be the best way to loop through this list and go to the first unanswered question?

An example of the array of answered questions would look something like this "1,4,6" so this user would have answered questions number 1, 4 and 6. When a user logs in I'd like to direct them to the first unanswered question, in this case 2. Once the second question is answered the user would be redirected to the next unanswered question.

Any suggestions please?

回答1:

@Dog, I think this offers the functionality you are looking for.

Tip: See this answer for information on downloading Microsoft's authoritative WSH reference as a Windows help file.

Option Explicit

Dim oQsm : Set oQsm = New QuestionStatusManager

With oQsm
    .NumberOfQuestions = 10
    .RestoreStatus("1,4,6")
    .MarkQuestionAnswered(2)
    WScript.Echo "Questions " & .ToString() & " have been answered."
    WScript.Echo "Next unanswered question is: " & .GetNextUnansweredQuestion()
End With

Set oQsm = Nothing

' ------------------------------------------------------------------------

Class QuestionStatusManager

Private m_nNumberOfQuestions
Private m_aQuestionList()

Sub Class_Initialize()
    m_nNumberOfQuestions = -1
End Sub

Sub Class_Terminate()
    Erase m_aQuestionList
End Sub

Public Property Let NumberOfQuestions(n)
    Dim bValid : bValid = False

    If IsNumeric(n) Then
        If n = CInt(n) Then
            bValid = True
        End If
    End If

    If Not bValid Then
        Err.Raise vbObjectError + 1, "", _
           "Value '" & n & "' is not an integer."
    End If

    m_nNumberOfQuestions = CInt(n)
    ReDim m_aQuestionList(n)
End Property

Public Property Get NumberOfQuestions()
    CheckState
    NumberOfQuestions = m_nNumberOfQuestions
End Property

Private Sub CheckState()
    If m_nNumberOfQuestions = -1 Then
        Err.Raise vbObjectError + 1, "", _
           "Property 'NumberOfQuestions' has not been set."
    End If
End Sub

Sub RestoreStatus(sAlreadyAnswered)
    CheckState

    Dim aAlreadyAnswered : aAlreadyAnswered = Split(sAlreadyAnswered, ",")
    Dim i

    For i = 0 To UBound(m_aQuestionList)
        m_aQuestionList(i) = False
    Next

    For i = 0 To UBound(aAlreadyAnswered)
        m_aQuestionList(CInt(aAlreadyAnswered(i))) = True
    Next
End Sub

Sub MarkQuestionAnswered(n)
    Dim sDesc

    CheckState

    On Error Resume Next
    m_aQuestionList(n) = True

    If Err Or n = 0 Then
        sDesc = Err.Description
        On Error GoTo 0
        Err.Raise vbObjectError + 1, "", _
           "Can't mark question number '" & n & "' as answered: " & sDesc
    End If
End Sub

Function GetNextUnansweredQuestion()
    CheckState

    Dim i

    For i = 1 To UBound(m_aQuestionList)
        If Not m_aQuestionList(i) Then
            GetNextUnansweredQuestion = i
            Exit Function
        End If
    Next

    GetNextUnansweredQuestion = -1
End Function

Function ToString()
    CheckState

    Dim sDelim : sDelim = ""
    Dim i

    ToString = ""
    For i = 1 To UBound(m_aQuestionList)
        If m_aQuestionList(i) Then
            ToString = ToString & sDelim & CStr(i)
            sDelim = ","
        End If
    Next
End Function

End Class