Сумма прописью для заранее неизвестного языка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сумма прописью для заранее неизвестного языка

Сообщение arthur2 » 30.01.2008 (Ср) 18:42

Есть простенькая функция для получения падежа:

Private Function padej(ByVal num As Integer) As Integer
num = num Mod 100
Select Case num
Case 0, 5 To 20 ' 15 часов минут рублей очков коней бутылок
padejy = 3
Case Else
padejy = num Mod 10
Select Case padejy
Case 2 To 4: padejy = 2 ' 22-24 часа минуты рубля очка коня бутылки
Case 1: padejy = 1 ' 51 час минута рубль очко конь бутылка
Case Else: padejy = 3 ' 76 часов минут рублей очков коней бутылок
End Select
End Select

End Function


Затем, условно:

i = 13957
k = padej(i)
s = i & Choose(k, "час (рубль, конь, бутылка, окно)", "часа (рубля, коня, бутылки, окна)", "часов (рублей, коней бутылок, окон")

Но алгоритм не для русского языка может быть абсолютно другим!

В связи с чем хотелось бы записать функцию не алгоритмом, а математической формулой. Ну типа y= (x умножить на трампампа делить на тирлимтим).

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

Итак, вопрос: как описать эту и подобные функции не алгоритмом, а математической формулой?

А может быть есть какая-нибудь другая идея?
Последний раз редактировалось arthur2 30.01.2008 (Ср) 22:14, всего редактировалось 1 раз.

Belkin
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 02.11.2007 (Пт) 18:02
Откуда: Рязань

Сообщение Belkin » 30.01.2008 (Ср) 19:39

Да, интерпритировать язык, темболее русский, в математические функции для меня что-то новое.
На мой взгляд это практически не возможно, если только найти определенные закономерности в небольших его конструкциях.
Андрей.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Сумма прописью для заранее неизвестного языка

Сообщение jangle » 30.01.2008 (Ср) 20:36

arthur2 писал(а):Итак, вопрос: как описать эту и подобные функции не алгоритмом, а матиматической формулой?

А может быть есть какая-нибудь другая идея?


Смотри формальные грамматики, c помощью них можно задать некоторые синтаксические правила: http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 30.01.2008 (Ср) 23:04

Ну это несколько не то. Или даже не то что не то, а слишком сложно -- я очень мало чего там понял.

Попробую переформулировать -- может самому понятнее станет. Итак, есть строка: "бармаглот|бармаглота|бармаглотьев".

Руководствуясь некими правилами, программа выбирает, к какому числу какое слово прилепить, чтобы получилось 379 бармаглотьев.

Задача в том, чтобы правила эти не были жёстко прописаны в программе, а как-нибудь хитро и компактоно упакованы вместе с самой строкой.

В идеале я это представлял так: "ВолшебнаяМегоФормула|бармаглот|бармаглота|бармаглотьев"

Программа сначала читает ВолшебнуюМегоФормулу, и уже по ней решает, как распоряжаться с остальным. Причём, формула не должна описывать все возможные случаи и комбинации -- пусть она относится только к своей строке и ни к какой больше.

Похоже, копать надо куда-то в сторону регулярных выражений... Но только чёй-то плохо у меня пока копается

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 31.01.2008 (Чт) 10:50

arthur2 писал(а):Задача в том, чтобы правила эти не были жёстко прописаны в программе, а как-нибудь хитро и компактоно упакованы вместе с самой строкой.


Слова то все равно, прийдется прописывать в программе, их же в виде правил не представишь

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 01.02.2008 (Пт) 22:43

Зачем же? Слова можно хранить в отдельном файле -- для каждого языка своём.

Вообще-то, проблемку в общих чертах я решил. Кода не пишу -- пока не доотладил , а принцип такой:

Отдельно хранятся правила, которые не на один раз. У каждого своё имя - оно же пример применения.

===================
столько_же ?x=N
меньше ?x<N
больше ?x>N
ничего ?x=0
ключ ?(x%10=1)&((x%100=1)|(x%100>20))
ключа ?(x%10=2,3,4)&((x%100<5)|(x%100>20))
ключей ?(x%10=0,5_9)|(x%100=5_20}

===================
? - если
% - остаток от деления
& - логическое И
| - логическое ИЛИ
0,5_9 - диапазон (0 или от 5 до 9)
(всякие прочие делить-помножить так же поддерживаются)

Теперь фарза. Вот, например (всё, что между $$ -- шаблоны):


У вас $не осталось;осталось всего лишь;осталось;в запасе ещё$
$ни одного носка;# носок;# носка;# носков$

Теперь задаю правила для этой строки (отдельно для каждого из возможных вариантов, в том же порядке:

$[x=@socks /*загружаю в икс носки, оставшиеся у юзера*/

;?x=0 ;?x<4 ;?x<10;? /*одноразовые правила формулирую прямо на месте*/

;!ничего;!ключ;!ключа;!ключей]$ /*на многоразовые правила ставлю ссылку-псевдоним*/

Если в икс загрузить ноль, получится: "У вас не осталось ни одного носка"
Если загрузить 4: "У вас осталось всего лишь 4 носка"

8 : "У вас осталось 8 носков"

10, 15, 3298: "У вас в запасе ещё 10, 15, 3298 носков"

И какое бы число не подставил, носки просклоняются правильно. А вот, кстати, и глюк: если носок один "осталось"-то не подходит, нужно "остался". Значит это слово нужно вынести в отдельный шаблон и прогнать через те же ключ-ключа-ключей.

Если интересно, могу и код выложить -- когда будет готов.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 103

    TopList