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

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

Кстати, перед выполнением выравнивания не помешает удалить двойные пробелы.
...
Рейтинг: 0 / 0
Редактирование текста
    #38538865
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быстрее будет сплитануть строку по пробелу, рассчитать, сколько надо пробелов в каждом месте, и сколько выравнивающих, потом джойном собрать обратно и реплейсом с ограничением количества довести до требуемой длины.
...
Рейтинг: 0 / 0
Редактирование текста
    #38538869
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что осталось решить две проблемы.
Первая - как сказано выше, что делать, если неть пробелов.
Вторая - что делать с символами после точки, буде таковые имеются.
...
Рейтинг: 0 / 0
Редактирование текста
    #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
Редактирование текста
    #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
Редактирование текста
    #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
Редактирование текста
    #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
Редактирование текста
    #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
Редактирование текста
    #38542918
LLezar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лагман, вам тоже спасибо. Я ваше сообщение не увидел сначала.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Редактирование текста
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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