Русское сообщество по скриптингу

Правильные окончания слов после чисел

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Правильные окончания слов после чисел

Сообщение Mr. Frost » 05 ноя 2011, 09:22

Автор: Mr. Frost

Хочу представить небольшой сниппет, который может пригодиться в разных случаях.
Суть:
Думаю все согласятся, что строки вида "30 аммопаков", "21 игрок" читаются приятнее, чем "Аммопаки: 30", "21 игроков(а)". Как добиться, чтобы при изменении числа в плагине изменялось и слово после него по смыслу?
Допустим у нас есть слово "игроки" и число X. Сначала нужно слово превратить в три вида:
A. мн. число, род. п. — "игроков"
B. нач. форма — "игрок"
C. ед. число, род. п. — "игрока"
...а затем узнать последние цифры числа X. Для этого мы узнаём остаток от деления на 10 и на 100:
Код: Выделить всё
new num100 = X % 100
new num10  
= X % 10

Теперь у нас два числа. Как мы будем их использовать? Мы будем их сравнивать с помощью условных операторов.
Код: Выделить всё
 new num100 = X %100, // Узнаём остаток от деления числа на 100
num10 = X % 10; // Узнаём остаток от деления числа на 10
 
// Если 5 ≤ num100 ≤ 20 или num10 = 0 или 5 ≤ num10 ≤ 9...
if(num100 >= 5 && num100 <= 20 || num10 == 0 || num10 >=&& num10 <= 9)
    // ...то возвращаем "игроков"
    return A;
 
// Если num10 = 1...
else if(num10 == 1)
    // ...то возвращаем "игрок"
    return B;
 
// Если 2 ≤ num10 ≤ 4...
else if(num10 >= 2 && num10 <= 4)
    // ...то возвращаем "игрока"
    return C;


Для примера, в прикреплениях код плагина, который делает рестарт через некоторое время, после смены карты и выводит в HUD время, оставшееся до рестарта.

Update #1
Добавил include в аттачи. С ним можно просто использовать функцию:
Код: Выделить всё
#include <wordending>
 
// ...
 
new str
[512];
get_ending(
    n, //Число
    "first ending", // мн. число, род. п
    "second ending", // нач. форма
    "third ending", // ед. число, род. п
    sizeof str-1, // длина
    str // переменная, в которую будет записывать нужное окончание
);

Хочу отметить, что в переменную будет записывать только нужное слово, без самого числа.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Mr. Frost 07 дек 2016, 21:59, всего редактировалось 7 раз(а).
Скупе: b-boy_frost

Мои плагины:
Team Select Menu Customizer 0.1.2beta — изменяем/добавляем персонажей в меню выбора команд.
Buy Menu Management 2.0 — добавляем Extra Items в меню закупок на классик-сервер.
Аватара пользователя
Mr. Frost
 
Сообщения: 368
Зарегистрирован: 06 апр 2011, 19:32
Откуда: Антлантида
Благодарил (а): 16 раз.
Поблагодарили: 73 раз.
Языки программирования: Тамагочи

Re: Правильные окончания слов после чисел

Сообщение Небожитель » 05 ноя 2011, 21:06

Да не плохо,но сокращение всё спасает. 1 сек. , 21 сек. :-D

ну и инклюд не плохо бы выложить,всё равно найдется гений,который скажит,что у меня не компилируется плагин.
KORD_12.7
defa
EvilCoder - гений,но противный.
Аватара пользователя
Небожитель
 
Сообщения: 278
Зарегистрирован: 27 июл 2011, 21:51
Благодарил (а): 24 раз.
Поблагодарили: 53 раз.
Опыт программирования: Около 3 месяцев

Re: Правильные окончания слов после чисел

Сообщение Mr. Frost » 05 ноя 2011, 21:47

Хорошо, сейчас сделаем =)

Добавлено спустя 5 минут 13 секунд:
Done. Обновил первый пост.
Скупе: b-boy_frost

Мои плагины:
Team Select Menu Customizer 0.1.2beta — изменяем/добавляем персонажей в меню выбора команд.
Buy Menu Management 2.0 — добавляем Extra Items в меню закупок на классик-сервер.
Аватара пользователя
Mr. Frost
 
Сообщения: 368
Зарегистрирован: 06 апр 2011, 19:32
Откуда: Антлантида
Благодарил (а): 16 раз.
Поблагодарили: 73 раз.
Языки программирования: Тамагочи

Re: Правильные окончания слов после чисел

Сообщение nefik23 » 08 ноя 2011, 02:49

Хорош :)
Но сокращение действительно спасёт СКРИПТ!!
Есть вопрос, есть ChatBox.
Маленький блог помощи юзеру.
www.chatbox.do.am
Аватара пользователя
nefik23
 
Сообщения: 178
Зарегистрирован: 20 янв 2011, 19:20
Откуда: Из С.П.Б
Благодарил (а): 48 раз.
Поблагодарили: 24 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Правильные окончания слов после чисел

Сообщение TurangaLeela » 09 ноя 2011, 16:07

Mr. Frost, игроки и секунды есть ... а что если взять другое слово, к примеру "граната" ?
3 - секунДЫ
3 - гранаТЫ
3 - игроКА
Аватара пользователя
TurangaLeela
 
Сообщения: 930
Зарегистрирован: 24 авг 2010, 11:19
Откуда: Некрополь у Кремлёвской стены
Благодарил (а): 10 раз.
Поблагодарили: 266 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life
Valve Hammer Editor 3.5
C | C++ | Java

Re: Правильные окончания слов после чисел

Сообщение Mr. Frost » 11 ноя 2011, 13:56

TurangaLeela,
1. Гранат
2. Граната
3. Гранаты

TurangaLeela,
[pawn]
  1. new str[512], n[id]=3;

  2. get_ending(n, "гранат", "граната", "гранаты", sizeof str-1, str);

  3. format(msg, sizeof msg-1, "У Вас %d %s", n, str); //У Вас 3 гранаты.
[/pawn]
Скупе: b-boy_frost

Мои плагины:
Team Select Menu Customizer 0.1.2beta — изменяем/добавляем персонажей в меню выбора команд.
Buy Menu Management 2.0 — добавляем Extra Items в меню закупок на классик-сервер.
Аватара пользователя
Mr. Frost
 
Сообщения: 368
Зарегистрирован: 06 апр 2011, 19:32
Откуда: Антлантида
Благодарил (а): 16 раз.
Поблагодарили: 73 раз.
Языки программирования: Тамагочи

Re: Правильные окончания слов после чисел

Сообщение ILZM » 11 ноя 2011, 16:40

Там ошибка, должно быть "осталась 1 секунда".
Аватара пользователя
ILZM
 
Сообщения: 270
Зарегистрирован: 04 фев 2011, 15:21
Благодарил (а): 55 раз.
Поблагодарили: 43 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Правильные окончания слов после чисел

Сообщение Retro-kolt Lincoln » 19 ноя 2011, 12:26

Что-то не как не получается прикрутить в адванседбансу, тут тоже есть функция проверки числа но для английского языка
[pawn]
  1. GetBanTime(const bantime, length[], len)

  2. {

  3.         new minutes = bantime;

  4.         new hours = 0;

  5.         new days = 0;

  6.        

  7.         while( minutes >= 60 )

  8.         {

  9.                 minutes -= 60;

  10.                 hours++;

  11.         }

  12.        

  13.         while( hours >= 24 )

  14.         {

  15.                 hours -= 24;

  16.                 days++;

  17.         }

  18.        

  19.         new bool:add_before;

  20.         if( minutes )

  21.         {

  22.                 formatex(length, len, "%i минут%s", minutes, minutes == 1 ? "а" : "");

  23.                

  24.                 add_before = true;

  25.         }

  26.         if( hours )

  27.         {

  28.                 if( add_before )

  29.                 {

  30.                         format(length, len, "%i час%s, %s", hours, hours == 1 ? "" : "ов", length);

  31.                 }

  32.                 else

  33.                 {

  34.                         formatex(length, len, "%i час%s", hours, hours == 1 ? "" : "ов");

  35.                        

  36.                         add_before = true;

  37.                 }

  38.         }

  39.         if( days )

  40.         {

  41.                 if( add_before )

  42.                 {

  43.                         format(length, len, "%i д%s, %s", days, days == 1 ? "ень" : "ней", length);

  44.                 }

  45.                 else

  46.                 {

  47.                         formatex(length, len, "%i д%s", days, days == 1 ? "ень" : "ней");

  48.                        

  49.                         add_before = true;

  50.                 }

  51.         }

  52.         if( !add_before )

  53.         {

  54.                 // minutes, hours, and days = 0

  55.                 // assume permanent ban

  56.                 copy(length, len, "пожизненый бан");

  57.         }

  58. }
[/pawn]

Может поможете?
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: Правильные окончания слов после чисел

Сообщение Fedcomp » 19 ноя 2011, 12:28

как жаль что amxmodx не поддерживает плюрализацию.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: Правильные окончания слов после чисел

Сообщение Junkle XL » 19 дек 2011, 21:19

Error: Undefined symbol "num" on line 29

[pawn]
  1. new n=get_cvar_num("amx_money_freq")-num, //Число X
[/pawn]
Что не правильно? просто квар на свой заменил
Аватара пользователя
Junkle XL
 
Сообщения: 3
Зарегистрирован: 19 дек 2011, 19:44
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Статьи / фрагменты кода

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2