Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
2 / 2 / 1
Регистрация: 16.11.2009
Сообщений: 51
1

Алгоритм для работы со строками

17.03.2010, 21:05. Показов 3216. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Прошу помощи.

Есть массив, в котором записан текст из текстового файла. Так вот, нужно проверить, чтобы первое слово каждого предложения начиналось с заглавной буквы, и откорректировать.

У меня есть код, но он работает по обычному линейному алгоритму, т.е. он срабатывает когда такая схема текста: <Предложение>! <Сл.Предложение>, т.е после ! должен идти пробел, а потом начинаться следующее предложение. Но хотелось бы и так, чтобы обрабатывались ситуации, когда между предложениями нет пробелов.

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2010, 21:05
Ответы с готовыми решениями:

Алгоритм для автоматизации рутиной работы в Adobe
Доброго времени суток всем. Есть цель маленькая. Имеется Архив в котором находится отсортировонные...

Класс для работы сo строками
Помогите пжл разработать следующие элементы класса: Конструктор, позволяющий создать строку из n...

Функции для работы со строками в VB
Помогите со строками. Какие есть функции для обработки строк? В хелпе ничего разобрать не смог, а...

Класс для работы сo строками
Помогите пжл разработать следующие элементы класса: Конструктор, позволяющий создать строку из n...

8
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
18.03.2010, 01:53 2
Bloomfield, те варианты ошибок, при которых формально нельзя различить признак начала предложения, без смыслового анализа исправить не получится, так что рассматриваем только формальные признаки - и вперёд!
Что является формальным признаком конца предложения?
- Перевод строки (случаи форматирования по ширине вручную относим к ошибкам);
- Символ конца предложения ("." "!" "?" "..." и, может быть, ещё что-нибудь)
Пробелы вообще не учитываем (не буква).
Итого:
Если в тексте при последовательном просмотре обнаружен символ конца предложения - следующий буквенный символ должен быть в верхнем регистре.
1
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
18.03.2010, 11:44 3
Пробелы вообще не учитываем (не буква).
Это не совсем точно.
Более точным выглядит следующий алгоритм:
Если предложения в файле не разбиваются на отдельные куски в разных строках, то:
Считываем из файла очередную строку.
Проверяем 1 букву строки на регистр.
Идём по строке.
Если находим символ, которым должно кончиться предложение (. ! ?),
то проверяем следующий за ним символ. Если он не пробел, а буква, проверяем на регистр, если пробел, то берём следующий символ, пока не дойдём до буквы или конца строки.
Таким образом мы проверим регистр и при наличии пробела между предложениями, и без пробелов.
1
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
18.03.2010, 18:20 4
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Это не совсем точно...
Ну и в чём отличия?

кот Бегемот: "Если предложения в файле не разбиваются на отдельные куски в разных строках, то:"
i8085: "случаи форматирования по ширине вручную относим к ошибкам"


кот Бегемот: "Считываем из файла очередную строку. Проверяем 1 букву строки на регистр. Идём по строке. Если находим символ, которым должно кончиться предложение (. ! ?), то..."
i8085: "... признаком конца предложения ... - Перевод строки ... - Символ конца предложения ("." "!" "?" "..."

кот Бегемот: "...если пробел, то берём следующий символ
i8085: "Пробелы вообще не учитываем"

кот Бегемот: "Если находим символ, которым должно кончиться предложение (. ! ?),
то проверяем следующий за ним символ. Если он ..."

i8085: "Если в тексте при последовательном просмотре обнаружен символ конца предложения - следующий буквенный символ должен быть в верхнем регистре."

А проверять вообще не нужно - сразу меняем на верхний регистр, даже если он и так верхний. Так быстрее.
Всегда надо минимизировать логические функции, даже в программировании.
1
2 / 2 / 1
Регистрация: 16.11.2009
Сообщений: 51
18.03.2010, 20:36  [ТС] 5
Извиняюсь что сразу не сказал - буквы только русские! Поэтому проверить всё же придётся, т.к вычитаю шестнадцатеричное значение (Windows-1251). toupper с русскими буквами не работает.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
18.03.2010, 20:49 6
i8085
не стоило так бурно возмущаться, я уже указал в цитате, что меня смутила только одна ваша фраза, которая сбивает с толку, именно это я и хотел исправить
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,604
19.03.2010, 01:40 7
кот Бегемот, да какое возмущение, бог с вами, скажете тоже...
Написал, потому что абсолютно не въехал, чем отличается моё "Пробелы вообще не учитываем (не буква)", что вы процитировали с комментарием " которая сбивает с толку, ", от вашего "Если он не пробел, а буква, проверяем на регистр, если пробел, то берём следующий символ". Логически это одно и то же - пробелы игнорируем.

Сейчас понял. За время модераторства тут, у вас выработался стиль разжёвывать каждую фразу в ответах юзерам. И это правильно.
0
2 / 2 / 1
Регистрация: 16.11.2009
Сообщений: 51
20.03.2010, 07:17  [ТС] 8
Немного отходя от темы раздела:

Код будет примерно таким:
C
1
2
3
4
5
6
7
8
9
10
for (i=0; i<N-2;i++)
        if (i == 0 || ispunct(A[i]))
            if (!isspace(A[i+1])){
                if (A[i+1] > 'а' && A[i+1] < 'я')
                        A[i+1] = A[i+1] - 0x20;
            }
            else 
                if (isspace(A[i+1]) && (!isspace(A[i+2])))
                    if (A[i+2] > 'а' && A[i+2] < 'я')
                        A[i+2] = A[i+2] - 0x20;
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
20.03.2010, 12:02 9
Я бы алгоритм ещё дополнил некой системой поправления пользователя, а именно:
насколько мне известно, правила хорошего тона требуют, чтобы всякое новое слово по отношению к предшествующему разделителю (не к каждому в целом, но для любого разделителя предложений) было отделено переводом строки или собственно пробелом (или же табом по вертикали, или переходом по странице — я с этими символами не знаком). Поэтому, если откинуть вариант "Пробелы вообще не учитываем (не буква)." , я предлогию добавлять пробел после .?!... перед непосредственно последующим буквенным символом или, в случае более чем одного пробела между ними, удалять лишние. Как по мне, если "заказчик" просит следить за регистром с целью сделать читабельным текст, это добавление ему понравиться : )
0
20.03.2010, 12:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2010, 12:02
Помогаю со студенческими работами здесь

Класс для работы со строками
Вот мой класс: public class stroka { string Line; int n; public...

Класс для работы со строками
Нужно написать класс работы со строками и один метод (сложение строк). Помогите пожалуйста сделать,...

Пакет для работы со строками
Всем привет! решил выложить пакет для работы со строками из учебника Тома Свана (может кому...

Библиотека для работы со строками
Нужно определить результат выполнения фрагмента программы: char str1=&quot;C++ language&quot;; char...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru