Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобрать алгоритм (https://javascript.ru/forum/misc/18129-pomogite-razobrat-algoritm.html)

reutovo 18.06.2011 15:23

Помогите разобрать алгоритм
 
Есть скрипт
function xform(c, str1, str2, str5) {
    var c = Math.abs(c) % 100;
    if (c > 10 && c < 20) { return str5; }
    
    c %= 10;
    
    if (c > 1 && c < 5) { return str2; }
    if (c == 1) { return str1; } 
    
    return str5;
}

взят тут

Я его адаптировал под свои нужды, но меня мучает вопрос. Как всё-таки работает этот алгоритм? Сразу скажу, что программист из меня не ахти какой, но испытываю огромное желание научиться. Так что буду рад, если вы мне поможете.

Первым аргументом функции передается число, этот аргумент в теле функции делится по модулю 100. Почему по модулю 100?

SlavaPav 18.06.2011 15:30

Для начала отформатируйте его, чтобы было легче читать:
function xform(c, str1, str2, str5) {
    var c = Math.abs(c) % 100;
    if (c > 10 && c < 20) { return str5; }
    
    c %= 10;
    
    if (c > 1 && c < 5) { return str2; }
    if (c == 1) { return str1; } 
    
    return str5;
}

reutovo 18.06.2011 17:03

Цитата:

Сообщение от SlavaPav (Сообщение 109320)
Для начала отформатируйте его, чтобы было легче читать

Сделано.

Graphis 18.06.2011 19:24

Там есть пример

Использование:
str = x + xform (x,«яблоко»,«яблока»,«яблок )

Периодичность повторения окончаний 100
1 - Яблоко
101 - яблоко

2 - яблока
102 - яблока

50 - яблок
250 - яблок

reutovo 19.06.2011 12:22

Цитата:

Сообщение от Graphis (Сообщение 109335)
Там есть пример

Использование:
str = x + xform (x,«яблоко»,«яблока»,«яблок )

Периодичность повторения окончаний 100
1 - Яблоко
101 - яблоко

2 - яблока
102 - яблока

50 - яблок
250 - яблок

Я видел как использовать функцию. Более того, я её так и использую.
Вопрос в другом, я хочу понять принцип работы алгоритма.

Вот вы пишите - "периодичность повторения алгоритма 100", а что будет если периодичность повторения будет не 100, а 30? Можете не проверять, код будет работать так же. Почему именно 100, а не 1000 или 50?

melky 19.06.2011 12:32

при чем тут периодичность?

чтобы понять алгоритм. вспомните правила употребления существительных с числительными

сто взято, чтобы числа уменьшить. хоть миллион берите

reutovo 19.06.2011 13:34

Цитата:

Сообщение от melky (Сообщение 109442)
при чем тут периодичность?

чтобы понять алгоритм. вспомните правила употребления существительных с числительными

сто взято, чтобы числа уменьшить. хоть миллион берите

1. Сам не понимаю при чём тут периодичность.
2. Вспомнил.
3. Какие числа уменьшить? Для чего их уменьшать.

melky 19.06.2011 14:35

а вот при чем :)

1,21 яблоко
2-4,22-24 яблока
0,5-20,25-30 яблок_

20 периодичность...

function a(a, f1, f2, f3){

/*
  наша задача - свести это число (числительное) 
  к минимальному значению (красные цифры).
  для этого можно использовать модуль деления.

  примеры того,что снизу :

  было 1-20, осталось 1-20.(как было)
  было 21-30, стало 1-10.
*/

            a = a % 20 // остаток от деления на 20

// пойдем по числам , а не по формам  

          if ( a===0 ) return f3;
// тут ясно
           else if( a===1 ) return f1;

// полтора яблок*!*А*/!*
           else if ( a>1 && a<5 ) return f2;

// двадцать с половиной яблок_
// a может быть максимум 19, кстати))
           else if ( a>=5 && a< 21 ) return f3;

// на всякий
           else alert( "ERROR" );

       
}

var s='цифра | форма\n';

// маленький тест
for(var i=0;i<23;i++) s+= i+" | "+a(i,'яблоко','яблока','яблок')+" \n";

alert( s );

reutovo 19.06.2011 15:55

Цитата:

Сообщение от melky (Сообщение 109464)
а вот при чем :)

1,21 яблоко
2-4,22-24 яблока
0,5-20,25-30 яблок_

20 периодичность...

function a(a, f1, f2, f3){

/*
  наша задача - свести это число (числительное) 
  к минимальному значению (красные цифры).
  для этого можно использовать модуль деления.

  примеры того,что снизу :

  было 1-20, осталось 1-20.(как было)
  было 21-30, стало 1-10.
*/

            a = a % 20 // остаток от деления на 20

// пойдем по числам , а не по формам  

          if ( a===0 ) return f3;
// тут ясно
           else if( a===1 ) return f1;

// полтора яблок*!*А*/!*
           else if ( a>1 && a<5 ) return f2;

// двадцать с половиной яблок_
// a может быть максимум 19, кстати))
           else if ( a>=5 && a< 21 ) return f3;

// на всякий
           else alert( "ERROR" );

       
}

var s='цифра | форма\n';

// маленький тест
for(var i=0;i<23;i++) s+= i+" | "+a(i,'яблоко','яблока','яблок')+" \n";

alert( s );

Гран мерси! Дошло теперь. :victory:


Часовой пояс GMT +3, время: 15:42.