1 (изменено: tuma4ok, 2016-02-10 18:19:01)

Тема: AHK: Склонение слова в зависимости от числа

Здравствуйте. У меня возник вопрос как просклонять слово в зависимости от его количества. Например:

1 лодка
2 лодки
5 лодок
11 лодок
21 лодка

Пробовал переписать функцию с PHP на AutoHotKey, но к сожалению ничего не вышло. Надеюсь на вашу сообразительность, ум и помощь.
Заранее спасибо!

2

Re: AHK: Склонение слова в зависимости от числа

Хм, а разве такое возможно? Или нужно конкретно для лодки?
P. S.: 21 лодка.

3 (изменено: tuma4ok, 2016-02-10 18:22:13)

Re: AHK: Склонение слова в зависимости от числа

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


EndWord("лодк", Array("а","и","ок"), 2)

лодк - начало слова к которому потом добавится окончание.
Array("а","и","ок") - перечень последовательных окончаний.
2 - к какому числу нужно склонить.

4

Re: AHK: Склонение слова в зависимости от числа

Как скрипт может знать правила для всех слов? Словарь писать?

винт - винта
заяц - зайца
палец - пальца

5

Re: AHK: Склонение слова в зависимости от числа

ypppu, Я же говорил, окончания дописываются. Для винта берем основу за "винт", для заяц - "за", для пальца - "пал". Или же можно задать эти значения, то есть они передаются в массиве в функцию. Они должны быть в следующем порядке: заяц, зайца, зайцев; винт, винта, винтов; палец, пальца, пальцев.

6

Re: AHK: Склонение слова в зависимости от числа

Прилагаю функцию написанную на PHP.


function NumberEnd($number, $titles) {
    $cases = array (2, 0, 1, 1, 1, 2);
    return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
}

В первом параметре $number задается число к которому склоняем.
Во втором параметре $titles задается массив со словами. (Как я писал выше. Пример: палец, пальца, пальцев)
В этой строке:

$cases = array (2, 0, 1, 1, 1, 2);

Как я понял выбирается падеж. (Начала массива не с 1, а с 0)

Данная строка получает остаток от деления (символ % делит и возвращает остаток от деления)

$number%100

7 (изменено: serzh82saratov, 2016-02-14 03:57:36)

Re: AHK: Склонение слова в зависимости от числа

MsgBox % NumberEnd(21, ["лодка","лодки","лодок"])
 
NumberEnd(n, words) { 
	return words[mod(n, 100) > 4 && mod(n, 100) < 20 ? 3 
		: mod(n, 10) = 0 ? 3 : mod(n, 10) = 1 ? 1 
		: mod(n, 10) < 5 ? 2 : 3] 
}

Или аналог php:


NumberEnd(n, words) {
    return words[(m := mod(n, 100)) > 4 && m < 20 ? 3 
			: [3, 1, 2, 2, 2, 3][(m := mod(m, 10) + 1) > 6 ? 6 : m]] 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Склонение слова в зависимости от числа

Значит "словарь" всё-таки будет, но число слов невелико.
Я как-то так себе представляю:

рубль := ["рубль","рубля","рублей"]
доллар := ["доллар","доллара","долларов"]
фунт := ["фунт","фунта","фунтов"]

number := 100500
MsgBox, % "Ваша зарплата" " " number " " NumberEnd(number, рубль)
Return

NumberEnd(number, titles)
{
StringRight, x, number, 1
end := x=1 ? 1 : x>=2 && x<=4 ? 2 : (x>=5 && x<=9) || x=0 ? 3 :
StringRight, x, number, 2
If (x>=11) && (x<=14)
end := 3
Return titles[end]
}

9

Re: AHK: Склонение слова в зависимости от числа

Да, словарь будет. Простите за то что сразу неверно изложил свои мысли. И огромное спасибо за помощь!