Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Подстроки в строке Добавлено: 25.06.10 12:24  

Автор вопроса:  KiZ
Приветствую. Помогите советами хотябы по алгоритму:

Есть столбец ячеек, в каждой из которых содержится последовательность одинаковой длинны L из 0 и 1. Найти последовательнось единиц, которая входит в имеющуюся последовательность максимальное кол-во раз.
Например: 1100110111010101 - получаем:
1 - 3
11 - 2
111 - 1
1111-0
и т. д.
Спасибо.

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 25.06.10 13:00
  1. Private Sub Form_Load()
  2.     Const s = "011001101110101011111111"
  3.     For i = 1 To Len(s)
  4.         If Mid$(s, i, 1) = "1" Then
  5.             c = c + 1
  6.             If i = Len(s) Then maxc = c
  7.         Else
  8.             If c > maxc Then maxc = c
  9.             c = 0
  10.         End If
  11.     Next
  12.     result = maxc
  13. End Sub

Ответить

Номер ответа: 2
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #2 Добавлено: 25.06.10 13:18
эм... немного не так. Выдает, что максимально ответ - 8. Но нужно не максимально длинную, а максимальное кол-во встречающихся. например в моем примере - ответ. Чаще всего - 1 в кол-ве штук 3. В твоем примере - кстати однозначно сказать нельзя. там и "11' - встречается 2 раза и "1" - тоже 2.

Ответить

Номер ответа: 3
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #3 Добавлено: 25.06.10 17:13
  1. Sub SymbolChain()
  2.   Dim MyStr As String
  3.   Dim r As Integer
  4.   Dim i As Integer
  5.   Dim MaxVal As String
  6.   Dim Max As Byte
  7.   Dim c As Byte    'длина последовательности 1
  8.     
  9.   For r = 1 To 4
  10.     a = Split(Replace(Range("A" & r).Value, """", ""), "0")
  11.     MaxVal = ""
  12.     Max = 0
  13.     ReDim b(UBound(a), 1) As Integer
  14.     For i = LBound(a) To UBound(a)
  15.       If a(i) <> "" Then
  16.         c = Len(a(i)) - 1
  17.         b(c, 0) = a(i)
  18.         b(c, 1) = b(c, 1) + 1
  19.         If b(c, 1) > Max Then
  20.           MaxVal = b(c, 0)
  21.           Max = b(c, 1)
  22.         End If
  23.       End If
  24.     Next i
  25.   Next r
  26.   Range("B1").Value = "Значение " & MaxVal & " встречается " & Max & " раз."
  27. End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #4 Добавлено: 25.06.10 17:16
Последовательности находятся в колонке А
В 10 строке убираю " из очередного значения. Просто заводила как строки. Можно убрать, можно не убирать замену.

Ответить

Номер ответа: 5
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #5 Добавлено: 28.06.10 11:53
Спасибо, всем кто ответил. Я сделал вот так. В столбце А - находятся последовательности. В последующих столбцах, значения, которые встречаются в последовательности: столбец B - "1"; C-"11" и т.д. конечно громоздко и явно не идеально.
  1.  
  2. Sub Srav2()
  3.    Dim i As Integer
  4.    Dim k As Integer
  5.    Dim S As String
  6. For k = 3 To 311
  7. c = 0
  8. S = Cells(k, 1)
  9.     For i = 1 To Len(S)
  10.  
  11.         If Mid$(S, i, 1) = "1" Then
  12.  
  13.             c = c + 1
  14.  
  15.         Else
  16.  
  17.             Cells(k, c + 1) = Cells(k, c + 1) + 1
  18.             
  19.  
  20.             c = 0
  21.  
  22.         End If
  23.  
  24.     Next i
  25. If c <> 0 Then Cells(k, c + 1) = Cells(k, c + 1) + 1
  26.  
  27. Cells(k, Len(S) + 3) = 0
  28. For l = 1 To Len(S)
  29. If Cells(k, l + 1) >= Cells(k, Len(S) + 3) Then
  30. Cells(k, Len(S) + 3) = Cells(k, l + 1).Column - 1
  31. End If
  32. Next l
  33. Next k
  34.    End Sub

Ответить

Номер ответа: 6
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #6 Добавлено: 28.06.10 11:56
конечно, нужно, чтобы ячейки в столбцах B - и т.д. были пустые), да и кол-во строк в цикле для "k" я вручную вводил) просто запамятовал функцию последней используемой строки на листе =)

Ответить

Номер ответа: 7
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #7 Добавлено: 28.06.10 12:59
А почему не подходит ответ 3 ?

Ответить

Номер ответа: 8
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #8 Добавлено: 28.06.10 14:57
хм.. у меня выдает ошибку в 17 строке. "Overflow"

Ответить

Номер ответа: 9
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #9 Добавлено: 28.06.10 16:46
В ячейках на листе значения типа "1100110111010101" или нет ?

На какой итерации выскакивает ошибка ?
Может есть пустые ячейки в середине списка ? (хотя от этого там заглушка вроде есть .)

Ответить

Номер ответа: 10
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #10 Добавлено: 30.06.10 12:48
ввожу двенадцать единиц.
сразу на первой итерации ошибка. в других случаях ошибка в 13 строке. там значение Ubound(a) = -1. ( для проверки брал 111111011111)

Ответить

Номер ответа: 11
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #11 Добавлено: 30.06.10 17:40
Поправила:
  1. Sub SymbolChain()
  2.   Dim MyStr As String
  3.   Dim r As Integer
  4.   Dim i As Integer
  5.   Dim MaxVal As String
  6.   Dim Max As Byte
  7.   Dim c As Byte    'длина последовательности 1
  8.      
  9.   For r = 1 To 4  'кол-во ячеек с последовательностями
  10.     If Range("A" & r).Value <> "" Then
  11.       a = Split(Replace(Range("A" & r).Value, """", ""), "0")
  12.       MaxVal = ""
  13.       Max = 0
  14.       ReDim b(UBound(a), 1) As String
  15.       For i = LBound(a) To UBound(a)
  16.         If a(i) <> "" Then
  17.           'ищем была ли такая последовательность из 1
  18.           c = 0
  19.           Do While c < UBound(b)
  20.             If b(c, 0) = a(i) Then Exit Do
  21.             If b(c, 0) = "" Then Exit Do
  22.             c = c + 1
  23.           Loop
  24.           b(c, 0) = a(i)
  25.           b(c, 1) = Str(Val(b(c, 1)) + 1)
  26.           If Val(b(c, 1)) > Max Then
  27.             MaxVal = b(c, 0)
  28.             Max = Val(b(c, 1))
  29.           End If
  30.         End If
  31.       Next i
  32.       Range("B" & r).Value = "Значение " & MaxVal & " встречается " & Max & " раз."
  33.     End If
  34.   Next r
  35. End Sub

Ответить

Номер ответа: 12
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #12 Добавлено: 01.07.10 12:37
Здорово) но если хочешь еще подумать, то смотри какая фишка: 10101101101111 - тут "1" - 2 штуки, и "11" - тоже 2 штуки. В твоем случае он пишет, что "1" встречается 2 раза. Но на самом деле она должна выводить "11" - встречается 2 раза. Потому что "11" "лучше", чем "1". Как оказалось впоследствии, это не очень имеет значение...

Ответить

Номер ответа: 13
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #13 Добавлено: 01.07.10 17:32
А в первоначальной задаче такого не было...(разочарованно :-))
В 26 строке нужно написать
  1. If Val(b(c, 1)) >= Max And Val(b(c, 0)) >= Val(MaxVal) Then


И пользоваться. :-)

Ответить

Номер ответа: 14
Автор ответа:
 KiZ



Вопросов: 27
Ответов: 68
 Профиль | | #14 Добавлено: 02.07.10 13:55
да не) это я для себя уже поэкспериментировать, так сказать) Спасибо за ответы!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам