Возникают проблемы с разбиением строки 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