18.06.2011, 15:23
|
Интересующийся
|
|
Регистрация: 09.11.2008
Сообщений: 22
|
|
Помогите разобрать алгоритм
Есть скрипт
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?
Последний раз редактировалось reutovo, 18.06.2011 в 18:01.
|
|
18.06.2011, 15:30
|
|
Аспирант
|
|
Регистрация: 25.02.2010
Сообщений: 57
|
|
Для начала отформатируйте его, чтобы было легче читать:
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;
}
|
|
18.06.2011, 17:03
|
Интересующийся
|
|
Регистрация: 09.11.2008
Сообщений: 22
|
|
Сообщение от SlavaPav
|
Для начала отформатируйте его, чтобы было легче читать
|
Сделано.
|
|
18.06.2011, 19:24
|
|
Новичок на форуме
|
|
Регистрация: 15.06.2011
Сообщений: 8
|
|
Там есть пример
Использование:
str = x + xform (x,«яблоко»,«яблока»,«яблок )
Периодичность повторения окончаний 100
1 - Яблоко
101 - яблоко
2 - яблока
102 - яблока
50 - яблок
250 - яблок
|
|
19.06.2011, 12:22
|
Интересующийся
|
|
Регистрация: 09.11.2008
Сообщений: 22
|
|
Сообщение от Graphis
|
Там есть пример
Использование:
str = x + xform (x,«яблоко»,«яблока»,«яблок )
Периодичность повторения окончаний 100
1 - Яблоко
101 - яблоко
2 - яблока
102 - яблока
50 - яблок
250 - яблок
|
Я видел как использовать функцию. Более того, я её так и использую.
Вопрос в другом, я хочу понять принцип работы алгоритма.
Вот вы пишите - "периодичность повторения алгоритма 100", а что будет если периодичность повторения будет не 100, а 30? Можете не проверять, код будет работать так же. Почему именно 100, а не 1000 или 50?
|
|
19.06.2011, 12:32
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
при чем тут периодичность?
чтобы понять алгоритм. вспомните правила употребления существительных с числительными
сто взято, чтобы числа уменьшить. хоть миллион берите
|
|
19.06.2011, 13:34
|
Интересующийся
|
|
Регистрация: 09.11.2008
Сообщений: 22
|
|
Сообщение от melky
|
при чем тут периодичность?
чтобы понять алгоритм. вспомните правила употребления существительных с числительными
сто взято, чтобы числа уменьшить. хоть миллион берите
|
1. Сам не понимаю при чём тут периодичность.
2. Вспомнил.
3. Какие числа уменьшить? Для чего их уменьшать.
|
|
19.06.2011, 14:35
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
а вот при чем
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 );
|
|
19.06.2011, 15:55
|
Интересующийся
|
|
Регистрация: 09.11.2008
Сообщений: 22
|
|
Сообщение от melky
|
а вот при чем
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 );
|
Гран мерси! Дошло теперь.
|
|
|
|