Сейчас на сайте:
Пользователей: 0
Отсутствуют.
Роботов: 2
Yandex, Googlebot
Гостей: 84
Всех: 86
ВНИМАНИЕ! Конкурс по программированию!
Проект Programmers.kz и школа hotPen3D2D предлагает Вам курсы по веб-дизайну, веб-программированию и компьютерной графике. Подробности здесь.
Информация к новости
- Просмотров: 2484
- Автор: КазКиберГетик
Форматирование текста. Подбор вариантов ответа
Категория: Программирование » Delphi » Уроки Delphi
Думаю целесообразно поговорить в этот раз о том, как получить какие-то данные от пользователя, обработать их и принять необходимые действия. Это может понадобиться в разных ситуациях, например, при создании простых игр, требующих от игрока ответить на вопросы, вводя данные с клавиатуры. Лично я с этим столкнулся при создании игры "Угадай мелодию", когда мне потребовалось сравнить введённый в третьем туре игроком, вариант ответа.
Принцип данной системы прост - проанализировать полученный текст, преобразовать, а затем - вывести на экран. Под преобразованием я понимаю приведение текста к максимально-облегчённому для обработки варианту. Для того, чтобы иметь наглядно представление о том, с чем мы будет иметь дело, давайте поставим перед собой реальную задачу. Пусть мы захотели сделать небезызвестную игру "Поле чудес" (что-то я зациклился на тв-играх, ну да ладно), которую без функций обработки текста, не сделать.
Необходимо предусмотреть практически всё. Для начала давайте попробуем убрать все лишние пробелы из введённого выражения(мало ли что - вдруг игрок нажмёт на пробел там, где это не нужно). В Delphi есть специальная функция, которая уничтожает пробелы.
Теперь давайте подумаем - вдруг в программу поступит такой вариант ответа: "ПианинО". Ну случайно нажал на Shift. Или такой: "ПИАНИНО". Оба варианты верны, но записаны по-разному. Для того, чтобы компьютер сумел понять это, давайте заставим его перевести наше слово в один регистр, например, в нижний. Ведь варианты "ПианинО" и "ПИАНИНО" все сведутся к одному - "пианино", который намного легче обработать. Осуществив эту функцию, мы тем самым облегчим себе работу в будущем.
А что будет, если пользователь введёт, например, "Пианино!"? Конечно, компьютер это посчитает не правильным. А если будет целое выражение, и будет поставлена лишняя запятая, восклицательный знак или тире? Нужно обдумать все варианты и сделать так, чтобы не случилось раковой ошибки. И поэтому я предлагаю написать свою функцию, которая могла бы это всё делать. Для этого нам понадобятся базовые знания языка Pascal. Мы организуем цикл, который будет проверять каждую букву нужного слова, и в случае нахождения не нужного символа, он эго будет удалять. Рекомендую попробовать сделать Вам самим. Дам небольшие подсказки по тем встроенным функциям, которыми Вы можете воспользоваться.
Тем, у кого не получилась (или захотел проверить) эта функция, советую взглянуть на следующий код, который я придумал для создания "Угадайки".
Не забудьте объявить функцию:
Уважаемые читатели. Хотел бы заметить, что всё выше написанное не претендует на образец того, как нужно реализовывать подобные идеи. Это всего лишь моё видение того, как можно это сделать. Есть десятки подобных вариантов. Уверен, что можно сделать намного лучше и совершеннее, чем предлагаю Вам и заняться. Спасибо за внимание.
Источник: web-brodilka.ru
Принцип данной системы прост - проанализировать полученный текст, преобразовать, а затем - вывести на экран. Под преобразованием я понимаю приведение текста к максимально-облегчённому для обработки варианту. Для того, чтобы иметь наглядно представление о том, с чем мы будет иметь дело, давайте поставим перед собой реальную задачу. Пусть мы захотели сделать небезызвестную игру "Поле чудес" (что-то я зациклился на тв-играх, ну да ладно), которую без функций обработки текста, не сделать.
Необходимо предусмотреть практически всё. Для начала давайте попробуем убрать все лишние пробелы из введённого выражения(мало ли что - вдруг игрок нажмёт на пробел там, где это не нужно). В Delphi есть специальная функция, которая уничтожает пробелы.
function Trim(const S: string): string; function TrimLeft(const S: string): string; function TrimRight(const S: string): string;Эти все функции входят в модуль Sysutils и возвращают строку S с удалёнными из неё пробелами. Функция TrimLeft удаляет все пробелы слева от текста, TrimRight - справа. А мы воспользуемся просто функцией Trim, которая удалит все пробелы со всех сторон (замечу - если пробелы встретятся в середине текста, то они не будут удалены. Для этого необходимо писать собственную функцию).
Теперь давайте подумаем - вдруг в программу поступит такой вариант ответа: "ПианинО". Ну случайно нажал на Shift. Или такой: "ПИАНИНО". Оба варианты верны, но записаны по-разному. Для того, чтобы компьютер сумел понять это, давайте заставим его перевести наше слово в один регистр, например, в нижний. Ведь варианты "ПианинО" и "ПИАНИНО" все сведутся к одному - "пианино", который намного легче обработать. Осуществив эту функцию, мы тем самым облегчим себе работу в будущем.
function LowerCase(const S: string): string; // Преобразует строку к нижнему регистру (не работает с русским текстом) function UpperCase(const S: string): string; // Преобразует строку к верхнему регистру (не работает с русским текстом) function AnsiLowerCase(const S: string): string; // Преобразует строку к нижнему регистру (работа с латиницей и кириллицей) function AnsiUpperCase(const S: string): string; // Преобразует строку к верхнему регистру (работа с латиницей и кириллицей)Эти функции входят в модуль Sysutils. Как было помечено в комментариях, две первые функции отличаются от других двух тем, что последние обеспечивают работу с кириллицей (русским текстом). А это как раз то, что нам нужно. Код, приведённый ниже - результат прочитанного выше материала.
... var s1: string; begin Edit1.Text:=Trim(Edit1.Text); s1:=Edit1.Text; if s1 ...
Функция удаления символов
function Length(S): Integer; Возвращает число символов в строке (модуль SyStem) (определяет количество символов в строке) function Copy(S; Index, Count: Integer): string; Возвращает подстроку указанной строки (модуль SyStem) (Копирует со слова S, начиная с Index; Count-символов) function Delete(var S: string; Index, Count: Integer); Удаляет из строки заданную подстроку (модуль SyStem) (Удаляет из слова S, начиная с Index; Count-символов)Этих трёх функций работы с текстом вполне достаточно, чтобы создать необходимую процедуру. Попробуйте - лучше сделать самому, иначе тяжело научиться чему-либо, не прилагая никаких усилий.
Тем, у кого не получилась (или захотел проверить) эта функция, советую взглянуть на следующий код, который я придумал для создания "Угадайки".
... function Slovo:string; var s, s1: string; // создаём две текстовые переменные i: integer; begin s:=Edit1.Text; for i:=1 to length(s) do if (s[i]<> " ") and (s[i]<> ",") and (s[i]<> """") and (s[i]<> "!") and (s[i]<> """) and (s[i]<> ".") and (s[i]<> "-") then s1:=s1 + copy(s, i, 1); // Если в слове будет найден запрещённый символ, то он // будет удалён result:=ANSILowerCase(s1); // в итоге мы получим // усовершенствованное слово :) end; ...Подумайте, для чего мы объявили две переменные? Верно: если запрещённый символ не найден, то мы копируем следующий символ в переменную s1, иначе, ничего не происходит. Таким образом, допустим, из выражения "МаМа , МЫЛА раму!!!!!!!!!!!!!" мы получим нормальное "мамамылараму", которое гораздо проще учесть в своих вычислениях.
Не забудьте объявить функцию:
... function slovo: string; ...Для того, чтобы использовать нашу функцию в действии, предлагаю следующий код:
...
procedure Button1Click(Sender: TObject);
begin
if Edit1.Text="" then
ShowMessage("Введите какой-нибудь вариант!") else
begin
if (slovo="прочь") or (slovo="проч") or
(slovo="онуехалпрочь") or
(slovo="онуехалпрочьнаночнойэлектричке") or
(slovo="онуехалпроч") or (slovo="аапина") or
(slovo="онуехалпрочнаночнойэлектричке") or
(slovo="апина") or
(slovo="аапинаонуехалпрочьнаночнойэлектричке")
or (slovo="апинаонуехалпрочьнаночнойэлектричке")
or (slovo="аапинаонуехалпрочь") or
(slovo="апинаонуехалпрочь") then
protv:=protv+1 else neprotv:=neprotv + 1;
end;
...
Вот так легко можно осуществить возможность обрабатывать данные, сводя случайность к минимуму. Уважаемые читатели. Хотел бы заметить, что всё выше написанное не претендует на образец того, как нужно реализовывать подобные идеи. Это всего лишь моё видение того, как можно это сделать. Есть десятки подобных вариантов. Уверен, что можно сделать намного лучше и совершеннее, чем предлагаю Вам и заняться. Спасибо за внимание.
Источник: web-brodilka.ru
Вернуться
Комментариев: 0
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.




