Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > [ASM] Задача на строки |
Автор: octopus 4.11.2010, 00:52 |
Господа программисты! Была бы очень признательна, если бы Вы помогли с задачкой! Не предстваляю, как организовать подобное на Ассемблере... ![]() Суть задачи: Дан массив запрещенных слов и предложение, в котором могут быть(или не быть) эти самые слова. Нужно удалить слова из предложения. Можно использовать 2 строки(2ая для результата). Также можно потребовать точку, как признак конца исходного предложения. Заранее спасибо! |
Автор: iff 5.11.2010, 17:06 | ||
Какая ОС? Компилятор? Процессор? Для DOS, компиятор TASM, процессор Intel 8086+
Элементы данных, помеченыые ";*" изменять не рекомендуется. Программа работает так: 1)запрашивает ввод с клавиатуры строки, 2)запрещенные слова заменяет на звездочки. 3) выводит на экран результат Запрещенные слова указаны в массиве MASS, их количество в переменной MASSLE, их длины в массиве MASSL, их адреса в массиве MASSADR. В переменной DELIMITER указаны символы, которые считаются разделителями слов в предложении. Добавлено через 2 минуты и 33 секунды П. С. У этой программы есть минус: она чувствительна к регистру. Т.е. слово QWERTY будет заменено на звездочки, а Qwerty - нет. |
Автор: octopus 8.11.2010, 19:26 |
)) Все именно так)) Спасибо огромное. реализация...ммм...потрясная) я-то хотела кучу процедур делать, да все никак подступиться не могла...Спасибо! один только вопрос. 0DH, 0AH это ж новая строка. а по нажатию ентера она вводится в программу, если так можно выразится. т.е. эта программа расчитана для работы с файлами? или я чего-то не понимаю? Еще раз спасибо. Просто спасли!)) |
Автор: iff 8.11.2010, 21:04 |
Вы имеете ввиду что выводится 0DH, 0AH перед выводом результата и после него? Да, это перевод строки. На экране. Когда мы воводим 0DH, 0AH курсор переходит на начало следующей строки. |
Автор: octopus 9.11.2010, 21:11 | ||
)) Спасибо, не сразу поняла. Я, как порядочная, хотела сама удаление организовать, да видно не судьба. Вот то, что у меня получилось. Тут есть ошибки, но предыдущие варианты либо циклились, либо толку от них не было...
Жду комментариев))) Спасибо. ЗЫ еще вопрос. столкнулась с проблемой: через командную строку все замечательно работает, а вот через эмулятор(emu8086 4.00b7) никакого эффекта. с чем это может быть связано? |
Автор: octopus 10.11.2010, 20:28 |
Так-то оно так. Но если подходить к лабе с этой стороны, то пусть это будет фильтр сообщений в чате, где некоторые могут позволить себе лексические вольности(а в массиве как раз эти вольности и содержатся))) тогда удаление вполне оправданно, особенно если публика чувствительная... По правде говоря, задание состоит в том, чтобы УДАЛИТЬ запрещенные слова. Как видите, мне не удается это сделать самостоятельно((( А именно, почему в 9 строке компилятор выдает ошибку? в предыдущем блоке была такая же по смыслу операция... |
Автор: iff 10.11.2010, 22:07 | ||
1) ошибку выдает из-за того что CX - слово, а LEN - байт. 2)
в данном случае удалить и "замазать" (заменить на символ "*") - это синонимы. Но если хотите все таки сделать так что слово имменно бесследно исчезает из текста, то вот иллюстация: http://www.radikal.ru Это строка длинной 7 которая начинается со смещения 0; а нужно удалить подстроку длинной 2, которая начинается со смещения 2 Мы видим, что при использовании reb movsb, мы должны: а) инициализировать SI как смещение основной строки+смещение удаляемой подстроки+длина подстроки. в данном случае 0+2+2=4. б) DI инициализировать как адрес начала удаляемой подстроки (в данном случае 2) в) в CX поместить смещение основной строки+длина основной строки-смещение удаляемой подстроки-длина удаляемой подстроки. В данном случае 0+7-2-2=3. г) незабудте переменную LEN уменьшить на длину удаляемой подстроки. |
Автор: octopus 16.11.2010, 20:28 |
Спасибо!! |
Автор: octopus 30.11.2010, 22:46 | ||
Да! На всякий случай, для тех, кому вдруг понадобится именно удаление! этот кусок кода удаляет слово вместе с пробелами после него.
Добавлено через 29 секунд может, не самая лучшая реализация, но я старалась) |