Задание: Сформировать по строке a$ новую строку по правилу: если слово имеет нечётную длину, удалить в нём среднюю букву. QBasic
Набросок:
Dim a$ As String, back$ As String, B() As String, i As Long, Poz As Long, n As Long
Print "Vvedite stroku";
Input a$
back$ = a$: i = 1: n = 1
Do
Poz = InStr(i, a$, " ")
if Poz > 0 Then n = n + 1 Else Exit Do
i = Poz + 1
Loop
ReDim B(n)
n = 1
Do
Poz = InStr(1, a$, " ")
if Poz > 0 Then
B(n) = Left(a$, Poz - 1)
a$ = Mid(a$, Poz + 1)
Else
Exit Do
End if
Loop
a$ = ""
For i = 1 To n
If Len(B(i)) Mod 2 = 1 Then B(i) = Left(B(i), (Len(B(i)) - 1)/2) & Mid(B(i), (Len(B(i)) + 3)/2)
a$ = a$ & B(i) & " "
Next i
a$ = Trim(a$)
Print "Staraya stroka: " & back$ & CHR(13) & CHR(10) $ "Novaya stroka: " & a$
End
Подскажите)
И если можно исправленный вариант, премного благодарен.
Аноним:
1. Тот же вопрос: определение "слова" и определение "разделитель слов в строке". 2. Без обид - код корявый и править его - это занятие дурное, гораздо проще и быстрее собственный написать.
Ответы
Ответ дал:
1
Принятые в программе ДОПОЛНИТЕЛЬНЫЕ К УСЛОВИЮ ЗАДАНИЯ соглашения:
1. Разделителями между словами считаются любые символы, включенные к константу delim
2. Все символы, не входящие в delim, образуют алфавит (т.е. "буквы"), из которого может быть составлено каждое слово
3. Количество разделителей, окружающих каждое слово, ограничено только здравым смыслом. Все разделители будут переданы в строку результата без изменения.
4. Если слово содержит только один символ, оно не изменяется, несмотря на то, что единица - нечетное число. В противном случае такое слово было бы исключено. К тому же, слово длиной в один символ не имеет "средней буквы"
CONST delim = " .,;:!?-"
DIM s AS STRING, s1 AS STRING, word AS STRING, wd AS STRING
DIM i AS INTEGER, n AS INTEGER, k AS INTEGER
INPUT "Введите строку: ", s
'Обеспечить наличие пробела за последним словом
IF INSTR(delim, RIGHT$(s, 1)) = 0 THEN s = s + " "
'Начальные присваивания
n = LEN(s): s1 = "": i = 1
DO WHILE i <= n 'Просматриваем входную строку символ за символом
'Ищем первый непробельный символ
wd = "" 'qq
DO WHILE (INSTR(delim, MID$(s, i, 1)) <> 0) AND (i <= n)
wd = wd + MID$(s, i, 1)
i = i + 1
LOOP
'Выделяем очередное слово, за которым следует пробельный символ
word = ""
DO WHILE (INSTR(delim, MID$(s, i, 1)) = 0) AND (i <= n)
word = word + MID$(s, i, 1)
i = i + 1
LOOP
'Найдено ли слово?
k = LEN(word)
IF k > 0 THEN 'Если слово найдено
'--- вырезается средний символ при нечетной длине ---
IF (k > 1) AND (k MOD 2 <> 0) THEN
k = (k - 1) \ 2
word = LEFT$(word, k) + RIGHT$(word, k)
END IF
'----------------------------------------------------
'Добавляем найденное слово через wd к выходной строке
s1 = s1 + wd + word
END IF
LOOP
PRINT "Результат: " + s1
END
Примеры работы программы:
1. Обычный текст: слова через один пробел
Введите строку: А роза упала на лапу Азора
Результат: А роза упла на лапу Азра
2. Использовано больше одного пробела и разделители : и !
Введите строку: Пример №2: Ура! Мы ломим: гнутся шведы!
Результат: Пример №2: Уа! Мы лоим: гнутся швды!
3. Использовано несколько непробельных разделителей подряд
Введите строку: Пример --№3--: Какое небо голубое!...
Результат: Пример --№3--: Каое небо голбое!...
1. Разделителями между словами считаются любые символы, включенные к константу delim
2. Все символы, не входящие в delim, образуют алфавит (т.е. "буквы"), из которого может быть составлено каждое слово
3. Количество разделителей, окружающих каждое слово, ограничено только здравым смыслом. Все разделители будут переданы в строку результата без изменения.
4. Если слово содержит только один символ, оно не изменяется, несмотря на то, что единица - нечетное число. В противном случае такое слово было бы исключено. К тому же, слово длиной в один символ не имеет "средней буквы"
CONST delim = " .,;:!?-"
DIM s AS STRING, s1 AS STRING, word AS STRING, wd AS STRING
DIM i AS INTEGER, n AS INTEGER, k AS INTEGER
INPUT "Введите строку: ", s
'Обеспечить наличие пробела за последним словом
IF INSTR(delim, RIGHT$(s, 1)) = 0 THEN s = s + " "
'Начальные присваивания
n = LEN(s): s1 = "": i = 1
DO WHILE i <= n 'Просматриваем входную строку символ за символом
'Ищем первый непробельный символ
wd = "" 'qq
DO WHILE (INSTR(delim, MID$(s, i, 1)) <> 0) AND (i <= n)
wd = wd + MID$(s, i, 1)
i = i + 1
LOOP
'Выделяем очередное слово, за которым следует пробельный символ
word = ""
DO WHILE (INSTR(delim, MID$(s, i, 1)) = 0) AND (i <= n)
word = word + MID$(s, i, 1)
i = i + 1
LOOP
'Найдено ли слово?
k = LEN(word)
IF k > 0 THEN 'Если слово найдено
'--- вырезается средний символ при нечетной длине ---
IF (k > 1) AND (k MOD 2 <> 0) THEN
k = (k - 1) \ 2
word = LEFT$(word, k) + RIGHT$(word, k)
END IF
'----------------------------------------------------
'Добавляем найденное слово через wd к выходной строке
s1 = s1 + wd + word
END IF
LOOP
PRINT "Результат: " + s1
END
Примеры работы программы:
1. Обычный текст: слова через один пробел
Введите строку: А роза упала на лапу Азора
Результат: А роза упла на лапу Азра
2. Использовано больше одного пробела и разделители : и !
Введите строку: Пример №2: Ура! Мы ломим: гнутся шведы!
Результат: Пример №2: Уа! Мы лоим: гнутся швды!
3. Использовано несколько непробельных разделителей подряд
Введите строку: Пример --№3--: Какое небо голубое!...
Результат: Пример --№3--: Каое небо голбое!...
Вас заинтересует
11 месяцев назад
11 месяцев назад
1 год назад
1 год назад
6 лет назад
6 лет назад
7 лет назад
7 лет назад