Построчное считывание из txt файла - VB

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Столкнулся с такой проблемой. Пишу программу тестирования и необходимо чтобы при каждой работе с программой. вопросы были в разном порядке. Решил что проще всего будет организовать путем считывания вопросов из файла txt(один вопрос=одной строке). Но вот как считывать строки random'но ума не приложу. Т.е. необходимо при нажатии кнопки "Следующий вопрос" в Label1.Caption был новый случайный вопрос(ну и желательно чтобы не повторялись вопросы при нажатии на кнопку "Следующий вопрос"). Всего вопросов-30
Таким образом естественно считывает только первую строку. Догадок никаких нет. Заранее признателен за помощь))

Решение задачи: «Построчное считывание из txt файла»

textual
Листинг программы
Option Explicit
Const countQ As Integer = 30 'Количество вопросов
Dim Q(1 To countQ) As String
Dim Ans(1 To countQ) As String
Dim NumRndQ(1 To countQ) As Long
Dim NumQ As Integer, i As Integer
 
Private Sub Form_Load()
    Dim ff As Integer, s As String
    ff = FreeFile: NumQ = 0
    Randomize
    Open App.Path & "\int.txt" For Input As #ff
        'do while not eof(ff)
        For i = 1 To countQ   'Количество строк в файле должно быть не менее количество вопросов, иначе будет ошибка
            Line Input #ff, s 'считываем построчно вопросы
            Q(i) = Split(s, "?")(0)
            Ans(i) = Split(s, "?")(1)
        Next i
        'loop
    Close #ff
    For i = 1 To countQ
         NumRndQ(i) = i
    Next i
    Call Unsort(NumRndQ)
    Call NextQuestion
End Sub
 
Private Sub Command2_Click()
    Call NextQuestion
End Sub
 
Public Sub NextQuestion()
    If NumQ >= countQ Then MsgBox "Больше вопросов нет!": Exit Sub
    NumQ = NumQ + 1
    Label1.Caption = "Вопрос № " & NumQ & "   " & Q(NumRndQ(NumQ)) 'Выводим вопросы на Label
    Dim i As Integer, n As Integer, A() As Long
    n = UBound(Split(Ans(NumQ), ","))
    ReDim A(0 To n)
    For i = 0 To n
         A(i) = Split(Ans(NumQ), ",")(i)
    Next i
    Call Unsort(A)
    For i = 0 To n
         Label2(i).Caption = A(i) 'Выводим варианты ответов на Label2
    Next i
End Sub
 
Public Sub Unsort(List() As Long)
Dim i As Long, min As Long, max As Long
Dim pos As Long, tmp As Long
min = LBound(List): max = UBound(List)
    For i = min To max - 1
        pos = Int((max - i + 1) * Rnd + i)
        tmp = List(pos)
        List(pos) = List(i)
        List(i) = tmp
    Next i
End Sub
 
Private Sub Label2_Click(Index As Integer)
    If CStr(Label2(Index).Caption) = CStr(Split(Ans(NumQ), ",")(0)) Then
         MsgBox "Правильно"
    Else
         MsgBox "Неправильно"
    End If
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5