![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Добрый день.
Задача следующая: Написать программу, которая считывает текст из файла и выводит предложения, которые не содержат запятых. Разобрался как работать с ReadLn, но загвоздка в том, что предложение может начиниться на одной строке, а заканчиватьяс на другой. Как прочитать весь файл целиком в массив, или, возможно есть другйо способ разделить файл на предложения...
Пытаюсь сделать так, но получаю ошибку. Насколько я понимаю ошибука обращения к памяти Это сообщение отредактировал(а) Bugmaker - 31.5.2009, 18:23 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Это сообщение отредактировал(а) kami - 31.5.2009, 19:04 |
|||
|
||||
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Не определены Result и PosEx....
Они должны быть integer? Извиняюсь.. вижу что объявлены.. компилятор выдает "Undeclared identifier: 'Result'" "Undeclared identifier: 'PosEx" Это сообщение отредактировал(а) Bugmaker - 31.5.2009, 19:22 |
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 11 Всего: 130 |
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Пишу на делфи билдере 7
вот весь код
Сорри комментарии будут крокозябами %) НО они есть в посте kami. Насколько я вижу вот тут: var Form1: TForm1; f:TFileStream; s, offer:string; StartPos, EndPos:integer; // íà÷àëüíàÿ è êîíå÷íàÿ ïîçèöèè ïðåäëîæåíèÿ Counter:integer; implementation Они уже объявлены, где еще это нужно сделать? |
|||
|
||||
| Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 11 Всего: 130 |
Русскую раскладку включи перед копированием текста. Извиняюсь, ступил: result - это же к функции относится. А PosEx где объявлена? Это, видимо, функция какого-то модуля. -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Вобщем вот такой код разбивающий весь файл на char'ы и запоминающий номер точек.. подскажите как теперь из этих char'ов собрать обратно нужные предложения) Это сообщение отредактировал(а) Bugmaker - 31.5.2009, 21:20 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Я привел код функции. И Result - это результат этой функции. Но! это код для подсчета количества предложений. Всего-то нужно добавить в него одну строку (условный оператор), чтобы получить выполнение задачи Кнопку F1 уже отменили? uses StrUtils; |
|||
|
||||
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
kami огромнейшее спасибо, разобрался)
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
||||
|
||||
| Bugmaker |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Возникла еще пара вопросов... первый в том, что предложение может оканчиваться вопросительным и восклицательным знаком а не точкой...
Второй - запятая может быть в дробном числе.. как учесть эти моменты? Чешу репу, ковыряюсь но надежды на меня мало... Помогите пожалуйста) У меня почему то такое ощущение что все придется переделывать ... не используя PosEx а перебирая каждый символ ( На данный момент код такой:
Думаю стоит перейти к такой вот форме..
Это сообщение отредактировал(а) Bugmaker - 3.6.2009, 22:20 |
||||
|
|||||
| kami |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Продолжаем.
Я не зря сказал, что когда найден offer, с ним можно сделать все, что угодно. С учетом вышесказанного (предложение может заканчиваться вопросительным и восклицательным знаком) дополним код:
Это исходное положение. Изменяем поиск EndPos.
Теперь - заменяем строку исходного текста
на
Сейчас напишу и про расширенный поиск запятых. Добавлено через 2 минуты и 6 секунд Кстати - из-за новой введенной функции текст от последней точки(вопросительного/восклицательного знака) до конца текста (даже если последний символ в тексте не является точкой/знаком) будет считаться предложением. |
||||||||
|
|||||||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Дополняем код после
Учитываем, что запятая может быть в дроби. Определяем, что дробь - это последовательность символов, включающая запятую, слева и справа от которой расположены цифры.
Теперь после offer:=Copy....... пишем
Писал прямо в браузере, мог с логикой немного напутать (в смысле, not не там, где нужно), но это уже оставляю на твоей совести - должен же быть какой-то творческий процесс |
||||
|
|||||
| Bugmaker |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 27.6.2008 Репутация: нет Всего: нет |
Result:=Result and not (str[cPos+1] in ['0'..'9'); // следующий символ - не цифра --- тут небольшая опечатка но это мелочи..
Вот эту часть не понял begin // в этой функции предполагается, что в позиции pos находится именно запятая и ничто иное. Result:=True; if cPos>1 then Result:=Result and not (str[cPos-1] in ['0'..'9']); // предыдущий символ -не цифра if cPos<Length(str) then Result:=Result and not (str[cPos+1] in ['0'..'9'); // следующий символ - не цифра end; Пока что програамма наоборот не выводит предложения с дробными числами... Зато выводит с обычными запятыми чего делать не должна( Помоему дело в функции IsValidComma ... Не вижу условия при котором она False... Это сообщение отредактировал(а) Bugmaker - 3.6.2009, 23:08 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Рассмотрим отдельно. 1. str[cPos-1] in ['0'..'9'] Если символ, предшествующий запятой находится в рамках от "0" до "9" (то есть является цифрой), то результат выполнения этой части кода будет True. И False - в противном случае. Рассматриваем полностью эту строку. 2. Берем предыдущий результат and результат 1).
Ну и сделай в последней строке function IsValidComma: Result:=not Result. Получишь инвертированный результат работы кода внутри функции и будет выводить другие предложения |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |