Небольшая подсказка
Подскажите, как сделать программу для удаления из текста каждое N-ое вхождение в него заданного слова.
При этом: Данные записываются в файл прямого доступа (если входные данные символы, то сначала нужно перевести их в коды, а потом записать в файл); обработать данные (использовать прямой доступ к компонентам файла) и записать результат в текстовый файл. После обработки файла создать его копию путем записи его содержимого в другой файл с использованием механизма «бестиповых файлов». НЕ ОБРАЩАЙТЕ ВНИМАНИЕ ПРО PHP, просто так код более читабельный PHP код:
Подскажите, как можно это реализовать(алгоритм) сравнение для удаления. Спасибо. |
Язык - Turbo Pascal 7.0
|
Да... хороша себе "небольшая подсказка"!
Исправил кучу ошибок, причесал, отладил, протестировал. Работает. Код:
Uses crt; И ещё парочка пожеланий (необязательных). 1. При использовании форматирования листинга очень желательно, чтобы горизонтальные отступы сопряженных begin и end были строго одинаковыми (как у меня). Это позволяет сразу увидеть вложенность операторов. 2. Использование одинаковых идентификаторов в качестве параметров подпрограмм и глобальных переменных хоть и не запрещено, но крайне нежелательно, поскольку снижает читабельность. Я уж исправлять не стал, но если будете ещё программировать, учтите этот момент. P.S. И ещё. В своей программе Вы (и я вслед за Вами) исходите из того, что в исходном файле каждое слово расположено в своей отдельной строке. Это так в задании оговорено или Вы "упростили"? Потому что если это не так, то требуется довольно муторная процедура выделения отдельных слов. |
Vladimir_S, я для тестирования сама себе такое "упрощение" сделала. И как я поняла, в моем способе(который Вы реализовали) есть недостаток, что при time = 1, удаляется все потому что любое число делится на 1 без остатка.
Спасибо Вам за помощь и советы. Постараюсь попробовать реализовать процедуру выделения отдельных слов. |
Например,
Код:
one Time = 1 Выведется: Код:
two |
Цитата:
Цитата:
1. Читаем символы исходного файла, пока не наткнемся на символ, отличный от пробела. 2. Копируем символы в новый файл до того, как появится очередной пробел или EoF. 3. Если "не EoF", то переводим строку в новом файле. 4. Возвращаемся к п.1. Далее работаем с новым файлом по существующей программе. Я бы так действовал. |
подскажите, что я сделала не так? Или я не так поняла Вашу мысль? Потому что я создала еще file of integer и начала к нему перекатывать символы.
Код:
Uses crt; Код:
one five, six, please! |
Цитата:
Цитата:
|
Так, ну, вроде, что-то такое слепилось и даже работает. Совсем голову сломал с этими символами 10 и 13 (не спрашивайте, что такое 13: боролся с ним эмпирически). Отличия от предыдущего варианта:
1. Исходный текст нужно поместить в файл preinput.txt. Файл input.txt, в котором каждое слово (со знаком препинания, если есть) занимает свою строку, сгенерит сама программа. 2. Понимает знаки препинания. Если после искомого пользовательского слова стоит, например, запятая, то она учитываться не будет. Теперь так. В выводном файле каждое слово занимает свою строку. Не, ну можно, конечно, запомнить структуру исходного файла а потом выходной файл отформатировать в соответствии с этой структурой, но мне кажется, это уже будет перебор. Код:
Uses crt; |
Vladimir_S, Ааааа, вот что вы имели ввиду. Но я всё-таки думаю, что нужно отформатировать. Так как в задание написано удалить текст, я вывела на экран файл "preinpur.txt". На выводе я бы вывела в таком же формате, только без удаленных слов. Было бы странно, если вместо текста пользователь получает строки с одним словом.
Попробую отформатировать(додуматься бы только, ведь наша программасчитывает по одному слову, игнорируя строки). Можно ли просто в конце каждого предложения поставить Код:
Спасибо Вам огромное! |
Да-аа, дорогая Мария-Мэри, ну Вы и обеспечили меня головной болью! Продираюсь потихоньку. Там та-акие подводные камни вылезают (особенно в преобразовании текстового файла в типизированный ЧЕРЕЗ СТРОКИ), что только держись! И не подозревал. Не зря я в практической работе всегда старался держаться от типизированных файлов подальше (не всегда, правда, удавалось), обходясь текстовыми, с которыми всё ясно и понятно.
Надеюсь, что скоро "добью". Но задачка чертовски интересная. Это не поиск максимального элемента массива и пр., с которыми, в основном, лоботрясы сюда и обращаются. |
Вложений: 3
Уж не знаю, актуально ещё или нет, но я это дело таки добил! Уф, ну задачка...
Значит, так. Во-первых, никаких строк! Сочетание строк с типизированным файлом это, как оказалось, гремучая смесь: постоянно вылезают заморочки с нумерацией, обработкой служебных символов и т.п. Поэтому работаем с исходным файлом, как он есть, никаких преобразований в формат "строка-слово". Исходный текст должен быть в файле input.txt. Единственное место, где оставлена строка, это считывание пользовательского слова. Всё! Во-вторых, убраны все экранные выводы. Ни к чему они там. В-третьих, процедура process построена совершенно иначе по сравнению с предыдущими вариантами. Суть: проходится файл ascii и формируются два массива е1 и е2 порядковых номеров начал (е1) и концов (е2) цепочек символов, подлежащих удалению. Дальше вновь проходится файл ascii и в файл output.txt отправляются только символы, не входящие в указанные цепочки. Таким образом, структура файла сохраняется. Код:
Uses crt; Вложение 436591 Вложение 436592 |
Vladimir_S, Вау, Вы смогли ее добить!:lupoglaz: Оказывается надо просто работать с исходным файлом, а я Вам какие-то преобразования "строка-слово"навязалаtehno003 Спасибо Вам огромное-преогромное!tehno003
|
Цитата:
|
Дополнительные вопросы
Vladimir_S, здравствуйте. У меня несколько вопросов к реализуемой Вами программе.
Мой первый вопрос: При большом объеме текста, программа выдает ошибку о нехвате памяти, поэтому я попробовала реализовать через динамические переменные, а именно FreeMem, GetMem. Но как-то получается, что сначала я ищу количество совпадений, выделяю память, а потом только по массиву делею перепись. Хотела бы узнать, как реализовать более эффективно. Мой второй вопрос: допустим у нас предложение: "it is his brother". Так как программа реализует проверку по посимвольному сдвигу, то после удаления слова "is", у нас останется "it h brother". Так и нужно? Ведь слова "his" и "is" это разные слова. Спасибо Вам за ответы. Код:
Uses crt; |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Так, ну, дорогие барышни, достали вы меня окончательно (в хорошем смысле :) ). Короче говоря, поколдовал я ещё с этой программкой, ну, надеюсь, теперь уже окончательно! Исправления:
1. Исправлен небольшой ляп (мой, признаЮ), вследствие которого сглатывались первые L символов, если они не соответствовали исключаемому слову. 2. Теперь работает только по СЛОВАМ, даже окружённым знаками препинания или признаком конца строки. Если искомое слово является ЧАСТЬЮ более длинного, то такие вставки исключаются из рассмотрения. Код:
Uses CRT; |
Браво, Владимир Игоревич!
|
Цитата:
|
Vladimir_S, Владимир Игоревич, Вы лучший!:pre:
|
Часовой пояс GMT +4, время: 23:53. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.