Показать сообщение отдельно
Старый 30.04.2012, 21:12   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от virginia Посмотреть сообщение
объясните пожалуйста эту часть пошагово
Ха, а я ведь предупреждал, что тут отнюдь не просто! Вообще задача изначально имеет куда более простое (и тупое) решение, если ввести дополнительную строку S1, а потом, например, с помощью оператора Case, задать таблицу заполнения этой S1, а в конце обратно переприсвоить S:=S1. Но Вы пошли по пути последовательной замены символов исходной строки, я, соответственно, тоже. Правда, тут возникает проблема.
Пусть, например, надо закодировать строку
zazazaza
из которой после кодировки должно получиться
azazazaz
Простой вариант - это идти по исходной строке "символ за символом" и заменять последовательно. Тогда получится не сложно, но долго и скучно. Но можно (как это сделано в программе) пытаться сразу заменить все одинаковые символы строки, что и реализовано.
Итак, начали. Первый символ - z. После замены всех символов "z" символом "a", имеем:
aaaaaaaa
И как, спрашивается, программе различить подлежащий замене исходный символ "a" от получившегося в результате замены и потому дальнейшему преобразованию не подлежащего? Вот для этого создается множество M порядковых номеров преобразованных символов. В данном случае после замены z→a это будет множество [1, 3, 5, 7], и символы "a", стоящие на указанных позициях, уже преобразованию не подлежат. Т.е. в данном примере на втором шаге будут заменены только "a", стоящие на позициях 2, 4, 6 и 8.
Ну и пара слов по структуре процедуры. Цикл по i - это последовательное прохождение символов исходной строки. Если текущего номера i нет в "черном списке" (множестве М), то производится замена всех символов строки, идентичных стоящему на i-той позиции, начиная с номера i и до конца (это цикл по k), причем и тут необходимо сверять позицию каждого заменяемого символа с "черным списком", и если эта позиция в нем есть, то пропускать. При этом во время каждой замены "черный список" пополняется номером заменяемого символа.
Понятнее стало? Надеюсь, что объяснил. Если всё же непонятно, спрашивайте.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070