Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Редактирование текста / 13 сообщений из 13, страница 1 из 1
26.01.2014, 23:51
    #38538522
LLezar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Доброго времени суток. Очень надеюсь на вашу помощь.
Мне дали задание:
"Дан текст, содержащий N строк. Каждая строка заканчивается точкой. Длина строки <= 60. Выровнять строки так, что каждая строка имела длину 60. Строка не должна начинаться и заканчиваться пробелами. Выравнивание строк проводить равномерно вставляя дополнительные пробела в тех местах, где они уже имеются. Вставлять требуемые пробелы в одном месте не допускается."

Подскажите, пожалуйста, как нужно написать цикл добавления этих пробелов. Я всю голову сломал, ведь не все строки равны, не во всех одинаковое кол-во символов, да еще слова не одного размера. Слова в массив я записал, а что дальше не знаю.
...
Рейтинг: 0 / 0
27.01.2014, 00:20
    #38538532
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Не знаю как записывал слова в массив, но если они уже там:
Построчно.
Определять суммарную длину слов.
(60-суммарная длина слов)/количество пробелов = количество пробелов между словами
Идею понял?
...
Рейтинг: 0 / 0
27.01.2014, 03:53
    #38538578
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
LLezarСтрока не должна начинаться и заканчиваться пробелами. Выравнивание строк проводить равномерно вставляя дополнительные пробела в тех местах, где они уже имеются.Тут есть немалое противоречие - а если в строке нет пробелов вообще?
...
Рейтинг: 0 / 0
27.01.2014, 11:09
    #38538697
_Дмит_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Я бы вообще работал только со строкой.
Находим последний пробел и вставляем после него ещё один, ищем следующий с конца и т.д. по кругу пока строка не станет 60.
А если на строке только одно слово или строка уже больше 60 и др. возможные исключения придётся учитывать отдельно.
...
Рейтинг: 0 / 0
27.01.2014, 11:19
    #38538707
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
_Дмит_Находим последний пробел и вставляем после него ещё один, ищем следующий с конца и т.д. по кругу пока строка не станет 60.проще написать, но дольше работает.
Если задача учебная или разовая или скорость непринципиальна - можно так и сделать.

Кстати, перед выполнением выравнивания не помешает удалить двойные пробелы.
...
Рейтинг: 0 / 0
27.01.2014, 13:04
    #38538865
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Быстрее будет сплитануть строку по пробелу, рассчитать, сколько надо пробелов в каждом месте, и сколько выравнивающих, потом джойном собрать обратно и реплейсом с ограничением количества довести до требуемой длины.
...
Рейтинг: 0 / 0
27.01.2014, 13:06
    #38538869
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Так что осталось решить две проблемы.
Первая - как сказано выше, что делать, если неть пробелов.
Вторая - что делать с символами после точки, буде таковые имеются.
...
Рейтинг: 0 / 0
28.01.2014, 01:20
    #38539844
LLezar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Ну я думаю, что пробелы есть в любом случае, раз в условии сказано о них. Не думаю, что препод будет к этому придираться. С точкой да, не понятно. Ну даже если считать, что точка это конец строки, я пока тоже не знаю как описать.
Ну в голове - то и так понятно было как, но на практике. Допустим я выяснил сколько символов у меня в строке, без пробелов. Это не проблема. Ну допустим 25. То есть 60 - 25 = 35 пробелов мне нужно добавить. Но не получается у меня написать такой цикл, который делает как нужно.
Вот к чему я только пришел:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
        While Len(LAB.Text) < 60                                                            (LAB.Text - это моя строка)                                       
                For j = 1 To 25                                                                  (тут переменная с кол-вом символов без пробелов естестн)
                    If LAB.Text(j) = "" Then
                        LAB.Focus()
                        LAB.SelectionStart = j + 1
                        LAB.Text &= " "
                    End If
                Next
        End While



Но во - первых, это у меня не работает. Вообще зависает как бесконечный цикл, походу я вирус написал. А во - вторых у меня же не одна строка, а N. С этим тоже проблема.
...
Рейтинг: 0 / 0
28.01.2014, 01:28
    #38539846
LLezar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
alex77755,

в массив вот так:
Код: vbnet
1.
2.
3.
        LAB.Text = LAB.Text.Trim()
        LAB.Text = Regex.Replace(LAB.Text, "\s+", " ")
        iBrr = Array.ConvertAll(LAB.Text.Split(Nothing), AddressOf Convert.ToString)
...
Рейтинг: 0 / 0
28.01.2014, 12:00
    #38540268
_Дмит_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Если цикл, то думаю так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
n = 60 - LEN(strA) + x - 1 'необходимое количество пробелов (x - кол. слов)
y = 0                                         'в массиве слов первый элемент 0
FOR i = 1 TO n                            'цикл по количеству пробелов
Mass(y) = Mass(y) + " "
     y = y + 1
     IF y = x-1 THEN y = 0             'в последнее слово не добавляем пробелы
NEXT i

strA = ""
FOR i = 0 TO x                           'цикл сшивает массив в строку (VB6 нет подрукой
      strA = strA + Mass(i)            'не помню как там работает JOIN  :)
NEXT i
...
Рейтинг: 0 / 0
29.01.2014, 20:07
    #38542717
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    
    ss = Split(s)
           
    For i = 0 To UBound(ss)
       textLen = textLen + Len(ss(i))
    Next i
    
    res = ss(0)
    spaces = desiredLen - textLen
    
    For i = 1 To UBound(ss)
        spaceLen = spaces \ (UBound(ss) - i + 1)
        spaceLen = IIf(spaces < spaceLen, spaces, spaceLen)
        res = res + Space(spaceLen) + ss(i)
        spaces = spaces - spaceLen
    Next i
...
Рейтинг: 0 / 0
29.01.2014, 23:39
    #38542917
LLezar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
_Дмит_,

Спасибо большое, очень помогли.

Вот код прикрепляю, который у меня получился, на всякий, вдруг кому понадобится:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
        BAL.Text = ""
        PE = LAB.Lines.Length
        z = 0
        MYNA = Len(LAB.Text)
        For i = 1 To PE
            Dim prob As String
            Dim i As Integer, mad As String

            For i = 0 To MYNA
                s &= LAB.Text(z)
                z = z + 1
                If LAB.Text(z) = "." Then
                    s &= LAB.Text(z)
                    k = i
                    Exit For
                End If
            Next
            s = s.Trim()
            s = Regex.Replace(s, "\s+", " ")
            iBrr = Array.ConvertAll(s.Split(Nothing), AddressOf Convert.ToString)
            prob = " "
            For i = 1 To Len(s) + 1
                mad = Mid(s & prob, i, 1)
                If mad = prob Then x = x + 1
            Next i


            For i = 0 To x - 1
                strA &= iBrr(i)
            Next


            n = 60 - Len(strA) 'необходимое количество пробелов (x - кол. слов)
            y = 0                                       'в массиве слов первый элемент 0

            For i = 1 To n                            'цикл по количеству пробелов
                iBrr(y) = iBrr(y) + " "
                y = y + 1
                If y = x - 1 Then y = 0 'в последнее слово не добавляем пробелы
            Next i

            strA = ""
            For i = 0 To x - 1                           'цикл сшивает массив в строку
                strA = strA + iBrr(i)            
            Next i
            BAL.Text &= strA & vbCr
            strA = ""
            x = 0
            s = ""
            z = z + 1
        Next
        REZERV = LAB.Text
        LAB.Text = BAL.Text
...
Рейтинг: 0 / 0
29.01.2014, 23:41
    #38542918
LLezar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование текста
Лагман, вам тоже спасибо. Я ваше сообщение не увидел сначала.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Редактирование текста / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]