Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 15.06.2010
Сообщений: 19

В исходной строке произвести циклическую перестановку слов влево на n слов

04.10.2010, 15:24. Показов 2243. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В исходной строке a$ произвести циклическую перестановку слов влево на n слов. Вывести исходную и полученную строки.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2010, 15:24
Ответы с готовыми решениями:

В исходной строке а$ произвести циклическую перестановку слов вправо на n слов. Вывести исходную и полученную
Помогите решить,пожалуйста: В исходной строке а$ произвести циклическую перестановку слов вправо на n слов. .Вывести исходную и полученную...

В исходной строке а произвести перестановку по алфавиту всех четных слов
В исходной строке а произвести перестановку по алфавиту всех четных слов. Вывести исходную и полученную строки

В исходной строке а произвести перестановку по алфавиту всех четных слов
Задание 2. В исходной строке а произвести перестановку по алфавиту всех четных слов. Вывести исходную и полученную строки.

7
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
04.10.2010, 19:21
PureBasic
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
CLS
Razdelitel$ = " "     'Разделитель строки
again:
INPUT "Vvedite stroku:"; a$
olda$ = a$
  IF a$ = "" THEN PRINT "Vvedite zanovo"
INPUT "Vvedite kol-vo slov:"; n%
   ' Проверяем кол-во слов в предложении
sl% = 0: stat% = 0: oldstat% = 1
FOR i% = 1 TO LEN(a$)
  IF MID$(a$, i%, 1) = Razdelitel$ THEN stat% = 1
  IF oldstat% = 1 AND stat% = 0 THEN sl% = sl% + 1
  oldstat% = stat%
  stat% = 0
NEXT
  ' Удаляем слева все разделительные знаки
FOR i% = 1 TO LEN(a$) STEP -1
  IF MID$(a$, i%, 1) = Razdelitel$ THEN a$ = RIGHT$(a$, LEN(a$) - 1) ELSE EXIT FOR
NEXT i%
  ' Удаляем справа все разделительные знаки
FOR i% = LEN(a$) TO 1 STEP -1
  IF MID$(a$, i%, 1) = Razdelitel$ THEN a$ = LEFT$(a$, LEN(a$) - 1) ELSE EXIT FOR
NEXT i%
  ' и ставим вместо них 1 разделитель справа
a$ = a$ + Razdelitel$
  ' Циклически вертим слова
FOR i = 1 TO n%
 stat% = 0: oldstat% = 0
 DO
  LfZn$ = MID$(a$, 1, 1)
  oldstat% = stat%
  stat% = 0
  IF LfZn$ = Razdelitel$ THEN stat% = 1
  IF oldstat% = 1 AND stat% = 0 THEN EXIT DO
  a$ = RIGHT$(a$, LEN(a$) - 1) + LfZn$
 LOOP
NEXT
CLS
PRINT "ishdnaya stroka:"; olda$
PRINT "Novaya stroka:"; a$
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
05.10.2010, 17:34
40 строк!
А так по-моему проще:
PureBasic
1
2
3
4
5
6
7
8
INPUT "vvedite stroku ", a$
INPUT "vvedite kol-vo slov ", n
FOR i = 1 TO LEN(a$)
IF MID$(a$, i, 1) = " " THEN k = k + 1
IF k = n - 1 THEN b$ = MID$(a$, i + 1) + " " + LEFT$(a$, i)
NEXT
PRINT "novaya stroka:"
PRINT b$
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
05.10.2010, 20:50
А так по-моему проще
Не пашет ваша программа, сказано циклическим образом, т.е. слово с одной стороны берётся и ставится в конец, это означает что я могу на 1000 сдвинуть и исходные слова должны оставаться в строке.
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
06.10.2010, 09:42
Чтобы программа работала для любого n, добавим подсчёт количества слов:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
INPUT "vvedite stroku ", a$
FOR i = 1 TO LEN(a$)
IF MID$(a$, i, 1) = " " THEN m = m + 1
NEXT
INPUT "vvedite kol-vo slov ", n
IF n > (m + 1) THEN n = n MOD (m + 1)
FOR i = 1 TO LEN(a$)
IF MID$(a$, i, 1) = " " THEN k = k + 1
IF k = n - 1 THEN b$ = MID$(a$, i + 1) + " " + LEFT$(a$, i)
NEXT
PRINT "novaya stroka:"
PRINT b$
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
07.10.2010, 01:08
Вот как должна выглядеть эта программа в полной мере, написанная не на скорую руку:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Rzd$ = " "   'Разделитель
Again: CLS : INPUT "Vvedite stroku      :", a$   ' Ввод строки
IF a$ = "" GOTO Again   ' Если строка пуста, вводим заново
'IF MID$(a$, LEN(a$), 1) <> Rzd$ THEN a$ = a$ + Rzd$
INPUT "Skolko slov dvigat' :", n
PRINT "ishodnaya:"; : WRITE a$
IF n = 0 GOTO Ok
ReFnd: IF MID$(a$, 1, 1) <> Rzd$ AND rg = 0 THEN s = s + 1
   FOR i = 1 TO LEN(a$) - 1   'Считаем слова -> s
    IF MID$(a$, i, 1) = Rzd$ AND MID$(a$, i + 1, 1) <> Rzd$ THEN
    s = s + 1: IF rg = 1 AND s = d THEN r = i
    END IF
   NEXT
 IF rg = 0 THEN d = n MOD s: rg = 1: s = 0: GOTO ReFnd ' На сколько слов дигать
Ok: PRINT "Resultat :"; : WRITE RIGHT$(a$, LEN(a$) - r) + LEFT$(a$, r)
И все идентичные задания должны писаться именно так, иначе решение принимает расплывчатый оборот и черт знает что может взбрести в голову как преподу так и программисту. Исходную строку СПЕЦИАЛЬНО не трогал(для её модификации вначале можно откоментировать 1 строчку и всё будет "по фирменному").

Поясню почему специально не трогал строку: это делается для "сохранности исходных данных", т.е. пользователь вводит строку, смотрит - а строка то уже не та, т.е. любая модификация и форматирование в данном случае делается ТОЛЬКО для защиты от неправильного ввода.
В идеале же программа должна работать с уже форматированными данными. Посему если программист не уверен что пользователь "не нагадит" то можно привести строку к такому виду, что программа сможет её обработать в любом случае.
В данном случае возможны несколько вариантов:
1) Удалить разделители слева (функция в моей прошлой программе). В этой программе она бы выглядела так(добавляется после 4 строки):
PureBasic
1
2
3
FOR i = 1 TO LEN(a$) STEP -1
  IF MID$(a$, i, 1) = Rzd$ THEN a$ = RIGHT$(a$, LEN(a$) - 1) ELSE EXIT FOR
NEXT
2) Добавить разделитель справа, если нету. (Функция уже есть: 4-я строка)
В этой программе этого будет достаточно для любого "кривого" ввода, но исходные данные будут изменены...
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
07.10.2010, 11:45
Это Ваше мнение. Но так же, как Вам плевать на моё, о чём вы сообщили недавно, так и мне, разумеется, на ваше.
Никто не вправе претендовать на истину в последней инстанции, поэтому заявления типа "именно так надо писать программы" просто бессмысленны.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
08.10.2010, 01:49
как Вам плевать на моё

Не по теме:

Мне не плевать на ваше мнение, мне плевать на то как "низко" вы обо мне думаете, т.к. вы обо мне ничего не знаете, как собственно и я о вас, кроме того, что вы хороший и грамотный программист. Такой "Пафос" в людях я ненавижу, типа смотреть с позиции птичьего полёта, для меня это верх неуважения, по крайней мере до неуважения я не опускаюсь(или в самых крайних случаях) пока сохраняю рассудок.


>именно так надо писать программы

Не по теме:

Не я начал эту минимализацию кода, уверен, программу можно ещё "упростить"\"уменьшить"\"оптимизиролвать ", но кто за это возьмётся, когда и так написан в достаточной степени ПОЛНЫЙ оптимизированный вариант, с защитой от некорректного ввода, в отличии от ВАШЕЙ якобы упрощённой программы для "троечника" непрограммиста, который всё равно не допетрит в том, как она работает.
На моей памяти было десятки случаев когда преподаватель давал задание переделать заданную программу на занятии, не прокатит просто пихнуть ему код, он пальцем в бумажкуу ткнёт и спросит "а что это за оператор", ответишь - сдал, не ответишь - не сдал(или даёт время подумать, что реже). Тут 2 варианта: 1 - понимаешь, 2 - не понимаешь. К тому же выбор всегда есть, топстартер захочет возьмёт вашу программу, чё вы переживаете.



Добавлено через 13 минут
Никто не вправе претендовать на истину в последней инстанции

Не по теме:

Вариантов написания этой программы много, спорить не буду, лучше я пока тут не видел(походу и не увижу, но интересно), потому что специально сел и исправил свои ошибки, додумал программу. К тому же вы неправильно трактуете, никакой последней инстанции нет, но программа уже всё что нужно может, больший функционал она уже не сможет предоставить и в контексте задания он НЕ НУЖЕН. Т.е учтён максимум возможных вариантов исходных данных. Я клоню к тому что максимум что будет - упрощение структуры(если вообще возможно) и соответственно по вашей фразе к тому, что моя логика - не последняя инстанция. Пишите, упрощайте, вдруг ваша логика лучше, я буду только рад.



Добавлено через 2 часа 33 минуты
Опишу алгоритм работы программы(на случай, если он покажется действительно таким уж непонятным):
У программы 2 состояния работы(rg = 0: подсчёт слов в строке, rg = 1: получение в переменной r позиции для разрезания строки и склейки её в друой последовательности). Т.е. допустим имеем 5 слов нужно циклически переставить слова на 7 слов влево, программа(в состоянии rg=0) в цикле находит что в строке 5 слов, считает насколько нужно передвинуть(d = n MOD s), далее прога переключает состояние на rg=1, возвращается и ищет в том же цикле позицию разбиения/разрезания строки. В данном случае позиция будет равна позиции последнего разделителя после конца второго слова(за неё отвечает переменная r). После того как в цикле найдена r, мы выполняем разрез строки и склейку в другой последовательности(первые 2 слова с пробелами в конце переносим в конец строки, 3-е слово переходит в начало).
В программе присутствует коррекция вычислений(строчка 8), нужна она для правильного подсчёта слов(в rg = 0), т.к. значение кол-ва слов прибавляется только при переходе от разделителя к символу не являющимся разделителем, т.е. основная причина недочёт первого слова. В режиме rg = 1 данная коррекция отключена для правильного "отлова" позиции r, в данном случае нам важен отсчёт s от нуля. Т.е. если мы двигаем слова на единицу, нам требуется найти позицию r равную переходу от разделителя(позиция i) к неразделителю(символу слова, позиция i+1), а таковая будет в начале второго слова(разделитель будет перед вторым словом, неразделителем будет первая буква второго слова, s станет равным единице и мы запишем в r значение i т.е. разделителя перед словом). Алгоритм чисто логический, он не содержит никакой сложной математики.

Не по теме:

кот Бегемот, вообще если человеку(я сейчас не говорю про топстартера, это в общем случае) влом проанализировать 15 строчек алгоритма, это уже извините только его проблемы, в правилах форума нет чётких границ как можно/нужно помогать.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2010, 01:49
Помогаю со студенческими работами здесь

Организовать циклическую перестановку слов
Для фразы на русском языке, в которой нет знаков препинания, а слова отделяются одним единственным пробелом, организовать циклическую...

Организовать циклическую перестановку слов
Нужно ввести N-ое количество строк,каждая строка имеет N-ое. количество слов(макс.100 символов),и вывести циклическую перестановку...

Выполнить циклическую перестановку элементов массива влево или вправо
Сформулировать одномерный массив целых чисел, используя датчик случайных чисел. По запросу выполнить циклическую перестановку элементов...

Дана строка из 20 слов. Сформировать строку, составленную из последних букв всех слов исходной строки
Задача: дана строка из 20 слов (или любого другого числа). Сформировать строку, составленную из последних букв всех слов исходной строки.

В исходной строке определить количество слов, заканчивающихся заданным символом
В исходной строке а$ определить количество слов, заканчивающихся заданным символом x$. Вывести строку, результат анализа и полученные слова


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru