Возникают проблемы с разбиением строки PascalCase и сохранением ее в массиве в VB

CorrectHorseBatteryStaple

в

Correct
Horse
Battery
Staple
(Empty)

Есть также подвох, я не могу использовать классы, функции, встроенные функции, кроме Mid(), Right(), Left(), Len(), Asc(). Что делает все это намного сложнее.

Я не могу понять, как сравнивать символы в строке и как-то останавливать цикл / сохранять первое слово в массиве и так далее.

Вот что я сделал до сих пор, что не имеет смысла:

Sub Main()
    Dim input As String
    Dim str(5) As String
    Dim tempstr As String
    Dim temp As Char
    Dim temp2 As Char
    Dim l As Integer
    Console.WriteLine("Enter the string: ")
    input = Console.ReadLine()
    l = Len(input)
    For z As Integer = 1 To 5
        For i As Integer = 1 To l
            temp = Mid(input, i, l)
            temp2 = Mid(input, i + 1, l)
            If Asc(temp) > 65 And Asc(temp) < 90 Then
                tempstr = temp
                If Asc(temp2) > 65 And Asc(temp2) < 90 Then
                    tempstr = temp
                Else
                    tempstr = tempstr & temp
                End If
            Else
                tempstr = tempstr & temp
            End If
        Next i
        str(z) = tempstr
    Next z
    For a As Integer = 1 To 5
        Console.WriteLine(str(a))
    Next a
    Console.ReadKey()
End Sub

2 ответа

Решение

Прежде чем начать, я бы предложил вам использовать список вместо массива. Таким образом, если вы хотите разделить больше слов, вам не нужно менять код. Тем не менее, я предполагаю, что вы еще не покрыли это. Так...

Простейшим способом было бы перебрать каждый символ массива и, если символ в верхнем регистре, перейти к следующему элементу массива и добавить этот символ в элемент массива. Если символ в нижнем регистре, просто добавьте его к текущему элементу массива. Вам не нужно использовать так много переменных таким образом.

Здесь предполагается, что первая буква будет заглавной. если этого не произойдет, будет

Индекс вне диапазона

ошибка.


Ну вот..

Module module1
    Sub Main()

        Dim input As String
        Dim str(3) As String
        Dim temp As String
        Dim l As Integer
        Dim z As Integer = -1 ' array index
        Console.WriteLine("Enter the string: ")
        input = Console.ReadLine()
        l = Len(input)
        For i As Integer = 1 To l
            temp = Mid(input, i, 1)
            'if temp is a capital letter increase the array index by 1 and add temp to that array item
            If (Asc(temp) >= 65 And Asc(temp) <= 90) Then
                z = z + 1
                str(z) = str(z) & temp
            End If
            ' if the temp is lower case then just add temp to the current array item
            If (Asc(temp) >= 97 And Asc(temp) <= 122) Then
                str(z) = str(z) & temp
            End If
        Next
        Console.WriteLine()

        For a As Integer = 0 To 3
            Console.WriteLine(str(a))
        Next a
        Console.ReadKey()
    End Sub
End Module

Я должен объяснить, почему Z начинается с -1. Это основано на предположении, что первая буква входной строки - верхний регистр.

Когда вы проходите цикл в первый раз, первый символ, который был сохранен в temp в верхнем регистре и содержимое первого If оператор выполняется, поэтому 1 добавляется к z, делая z=0. Затем эта первая буква в верхнем регистре добавляется к str(0), который является первым элементом массива.

Когда вы продолжаете цикл, последующие строчные буквы просто добавляются в str(0).

Когда цикл достигает следующей заглавной буквы, 1 добавляется к z снова, так что z=1 и заглавная буква добавляется к z(1) и так далее.

Ясно, что вы еще не запускали код. Он полон ошибок, из-за которых он никогда не будет работать так, как задумано.

Dim str(5) As String
For z As Integer = 1 To 5  ' will never run for over 5 words

на следующей строке, я думаю, вы хотели использовать Mid(input, i , 1), 1 не l, l даст вам всю строку, а не только одну букву.

        temp = Mid(input, i, l)
        temp2 = Mid(input, i + 1, l)

Эта строка не будет учитывать A а также Z, ты должен использовать >= а также <=

        If Asc(temp) >= 65 And Asc(temp) <= 90 Then

Эта строка вернет ошибку или пустую строку в последнем символе

temp2 = Mid(input, i + 1, l)

Эта строка не будет считать первый элемент в массиве

For a As Integer = 1 To 5
    Console.WriteLine(str(a))
Next a

Похоже, вы были ограничены вашим требованием использовать встроенные функции VB6, хотя функциональность VB.net поможет вам написать это более четко и в несколько строк.

Приведенный ниже код, опять же ограниченный 5 словами, должен дать вам нужный результат:

Sub Main()
    Dim input As String
    Dim str(5) As String
    Dim tempstr As String
    Dim temp As Char
    Dim temp2 As Char
    Dim l As Integer
    Dim arrCounnter As Integer
    Console.WriteLine("Enter the string: ")
    input = Console.ReadLine()
    tempstr = ""
    l = Len(input)

    For i As Integer = 1 To l
        temp = Mid(input, i, 1)
        'If capital, add to new temp; put old temp in array
        If Asc(temp) >= 65 And Asc(temp) <= 90 Then
            If tempstr <> "" Then
                str(arrCounnter) = tempstr
                arrCounnter = arrCounnter + 1
            End If
            tempstr = temp
        Else
            'If not, add to old temp, nxt
            tempstr = tempstr & temp
        End If
        If i = l Then str(arrCounnter) = tempstr
    Next i

    For a As Integer = 0 To 5
        If str(a) = "" Then
            Console.WriteLine("(Empty)")
        Else
            Console.WriteLine(str(a))
        End If
    Next a
    Console.ReadKey()
End Sub
Другие вопросы по тегам